1.题目:

给你单链表的头节点 ​head​ ,请你反转链表,并返回反转后的链表




输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]



2.代码实现

方法一:

*     int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = null;//定义一个pre指针指向头结点的前一个null,因为反转之后这里就是头结点就是尾结点,指向null
ListNode cur = head;//定义一个指针cur指向头结点

while(cur!=null){//循环条件是当cur指针指向null,pre指向尾结点时就停止
ListNode temp = cur.next;//定义一个临时指针先储存cur下一个结点,防止指针反转之后找不到,注意临时指针是会随着cur的变化而变化的,不能定义在循环外面
cur.next = pre;//先反转指针
pre = cur;//移动pre指针
cur = temp;//移动cur指针

}
return pre;

}
}

方法二:头插法,和两两交换链表中的结点很像!

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null){
return head;
}
//弄一个虚拟头结点来辅助
ListNode dummyHead = new ListNode();
dummyHead.next = head;
ListNode pre = head;//注意不要定向思维以为这两个指针一定是从虚拟头结点开始的
ListNode cur = head.next;
while(cur!=null){//这样这个null就不会移动,就放在这,最后直接连接尾部
ListNode temp=cur.next;//先保存cur的下一个结点
pre.next = temp;
cur.next = dummyHead.next;
dummyHead.next = cur;
cur = temp;//最后只移动cur指针,不用移动pre,让cur所指的每一个结点都插到pre前面!!

}
return dummyHead.next;//最后返回虚拟头结点的下一个结点就是最后的头结点


}
}


3.图解:

LeetCode.206 反转链表_结点