剑指 offer 笔记 15 | 反转链表

2019-06-19  本文已影响0人  ProudLin

题目描述
输入一个链表,反转链表后,输出新链表的表头。

问题分析
要正确的反转链表,需要调整指针的方向,为了更好的描述分析这个过程,可以用图来说明。

image.png

(1)一个链表。
(2)把 2 节点之前的 next 都指向前一个节点,导致节点 2、3 之间断裂。

所以我们需要在节点 2 断裂之前,把节点 3 保存下来,总的来说,在调整节点 1 的next 指针时,除了要保存 1 本身,还需要知道 1 的前一个节点。同时还要保存 2 节点,所以我们需要定义三个指针。

public class Solution {
    public ListNode ReverseList(ListNode head) {
    
        ListNode pre = null; //pre 为当前节点的前一节点
        ListNode next = null;//next 为当前节点的下一节点
        if(head==null){ // head 为当前节点
            return null;
        }
        while(head != null){
         //1、先用 next 保存head的下一个节点的信息,保证单链表不会因为失去head节点的原next节点而就此断裂
            next = head.next;
        //2、保存完 next,就可以让 head 从指向 next 变成指向pre了(指针反向开始变了)
            head.next = pre;
        //3、head指向pre后,就继续依次反转下一个节点
        //让pre,head,next依次向后移动一个节点,继续下一次的指针反转
            pre = head;

            head = next;
        }
      //如果 head 为 null 的时候,pre 就为最后一个节点了,
      //但是链表已经反转完毕,pre  就是反转后链表的第一个节点
      //直接输出 pre 就是我们想要得到的反转后的链表
        return pre;
    }
}

注意:对于这道题,至少要想到几种测试用例来检验:
1)输入的链头表指针是 null

  1. 输入的链表只有一个节点
    3)输入的链表有多个节点

参考文献:https://www.nowcoder.com/questionTerminal/75e878df47f24fdc9dc3e400ec6058ca
来源:牛客网

上一篇下一篇

猜你喜欢

热点阅读