剑指 Offer 24. 反转链表

171 阅读2分钟

剑指 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;

image-20220228221234490

理解了上面的带头节点,接着来了解一下不带头节点。

思路

  1. 记录头节点的位置
  2. 将头节点的下一个节点指向null,此时头节点为最后一个节点
  3. 此时head.next已经断裂,指向null
  4. 将cur的next链条指向当前flag记录的节点,也就是之前的头节点(头节点的链条断裂的)
  5. 将cur移动curNext记录的位置上来,继续将curNext后移。
  6. 依次完成,直到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. 反转链表