反转链表

leetCode–206(反转链表)

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

示例 1:

image-20220607214101110

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

示例 2:

image-20220607214111603

1
2
输入:head = [1,2]
输出:[2,1]

示例 3:

1
2
输入:head = []
输出:[]

解法一:迭代

定于两个指针,第一个指针pre指向null,第二个cur指针指向head。

不断的遍历cur,终止条件是:cur为空。

每次遍历,将cur指向pre。之后pre等于cur。cur向后移动一位。以此类推。

迭代.gif

代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* 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) {
ListNode cur = head;
ListNode pre = null;
ListNode next = null;
while(cur!=null){
next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
}

image-20220809172448973

image-20220809172531552

image-20220809172605118

image-20220809172645161

image-20220809172716283

image-20220809172747203

image-20220809172819709

image-20220809172855161

解法二:递归

image-20220607220309617

递归.gif

递归的两个条件:

  1. 终止条件是当前节点或者下一个节点==null
  2. 在函数内部,改变节点的指向,也就是 head 的下一个节点指向 head 递归函数那句

递归函数中每次返回的 cur 其实只最后一个节点,在递归函数内部,改变的是当前节点的指向。

代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 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 || head.next==null) return head;
ListNode newNode = reverseList(head.next);
head.next.next = head;
head.next = null;
return newNode;
}
}

反转链表
http://example.com/2022/06/07/反转链表/
作者
zlw
发布于
2022年6月7日
许可协议