剑指 Offer 24. 反转链表
Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
1、题目
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
实例1:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
提示:
0 <= 节点个数 <= 5000
2、思路
先来举一个带有头节点的例子
思路:
1.先定义一个节点reverseHead =new NodeList();
2.从头到尾遍历原来的链表,每遍历一个节点,就将其职出,并放在新的链reverseHead的最前端
3.原来的链表的head.next = reverseHead.next;
理解了上面的带头节点,接着来了解一下不带头节点。
思路
- 记录头节点的位置
- 将头节点的下一个节点指向null,此时头节点为最后一个节点
- 此时head.next已经断裂,指向null
- 将cur的next链条指向当前flag记录的节点,也就是之前的头节点(头节点的链条断裂的)
- 将cur移动curNext记录的位置上来,继续将curNext后移。
- 依次完成,直到cur.next为空则说明现在的cur指向的为表头的位置。
废话少说~~~~~上代码!
3、代码
使用栈
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode cur = head.next;
ListNode curNext = cur.next;
ListNode flag = head;
head.next = null;
while(cur.next != null){
cur.next = flag;
flag = cur;
cur = curNext;
curNext = curNext.next;
}
cur.next = flag;
return cur;
}
}
4、总结
该题目的最大难度在于是否理解链表的结构,理解双指针,对于初学者来说双指针是非常头疼的问题。
还有一个需要注意的地方为现在指向的为最后一个节点,需要将最后一个节点的链条来指向最后一个节点的前一个位置,那么前一个位置现在是谁呢,想一想是不是flag现在所指向的位置。所以 cur.next = flag; 至关重要。
❤️来自专栏《LeetCode基础算法题》欢迎订阅❤️
厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。
对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!
原题链接:剑指 Offer 24. 反转链表