leetcode 206.反转链表

164 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目描述

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

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

链表中节点的数目范围是 [0, 5000] -5000 <= Node.val <= 5000

题解

1.双指针

定义变量

左指针作为当前循环的最后一个节点,不用移动,就是原来链表的头部

右指针用于移动链表,标记下一次需要操作的节点

temp临时指针用于存储这次循环需要操作的最新节点.

newHead 用于存储目前最新的头结点,实际上就是上个循环的最新节点

流程

1.用temp记录下当前需要操作的节点,右指针向下移动,用于标记下一次循环需要操作的节点

2.将temp的下一个节点设置成newHead,那么temp就变成了最新的头结点

3.此时的left指针的下一个节点变成了right(下一次循环需要操作的节点)

4.newHead变成了temp

那么这样一次循环下来,就能将加入的节点变成了头结点,尾指针left 指向了下一个需要操作的节点,当下一个操作的节点为null时,代表已经将整个链表转换完成

public ListNode reverseList(ListNode head) {
        // 特殊情况,纯属恶心人
        if (null == head) {
            return head;
        }
        // 左右指针,左指针指向头部,不需要移动,右指针需要依次向后移动
        ListNode left = head;
        ListNode right = head.next;
        // temp用于保存原来的下一个节点,newHead用来储存最新的头指针,用于下一个节点指向头部
        ListNode temp;
        ListNode newHead = left;
        while (null != right) {
            // 记下右指针的原来的下一个节点
            temp = right;
            right = right.next;
            // 将右指针的下一个节点转移到头指针
            temp.next = newHead;
            // 现在的头指针变成了右指针
            left.next = right;
            newHead = temp;
        }
        return newHead;
    }

image.png