剑指–反转链表
1,题目:

2,思路:
方法一:双指针:
- 1.我们可以申请两个指针,第一个指针叫 pre,最初是指向 null 的。
- 2.第二个指针 cur 指向 head,然后不断遍历 cur。
- 3.每次迭代到 cur,都将 cur 的 next 指向 pre,然后 pre 和 cur 前进一位。
- 4.都迭代完了(cur 变成 null 了),pre 就是最后一个节点了。
下面是对应的图解:



















方法二:递归:
























3,代码:
方法一:双指针:
class Solution {
public ListNode reverseList(ListNode head) {
/*
1.我们可以申请两个指针,第一个指针叫 pre,最初是指向 null 的。
2.第二个指针 cur 指向 head,然后不断遍历 cur。
3.每次迭代到 cur,都将 cur 的 next 指向 pre,然后 pre 和 cur 前进一位。
4.都迭代完了(cur 变成 null 了),pre 就是最后一个节点了。
*/
//申请节点,pre和 cur,pre指向null
ListNode pre = null;
ListNode cur = head;
ListNode tmp = null;
while(cur!=null) {
//记录当前节点的下一个节点
tmp = cur.next;
//然后将当前节点指向pre
cur.next = pre;//这样指针就反向指引了
//pre和cur节点都前进一位
pre = cur;
cur = tmp;
}
return pre;
}
}
方法二:递归:
class Solution {
public ListNode reverseList(ListNode head) {
//递归终止条件是当前为空,或者下一个节点为空
if(head==null || head.next==null) {
return head;
}
//这里的cur就是最后一个节点
ListNode cur = reverseList(head.next);
//这里请配合动画演示理解
//如果链表是 1->2->3->4->5,那么此时的cur就是5
//而head是4,head的下一个是5,下下一个是空
//所以head.next.next 就是5->4
head.next.next = head;
//防止链表循环,需要将head.next设置为空
head.next = null;
//每层递归函数都返回cur,也就是最后一个节点
return cur;
}
}
本文详细介绍了两种反转链表的方法:双指针迭代和递归。通过双指针(pre, cur)迭代,每次将cur的next指向pre,再更新pre和cur;递归则利用反转后的链表特性,调整节点指向,最终返回链尾节点。代码实现清晰,便于理解。
274

被折叠的 条评论
为什么被折叠?



