美文网首页
剑指 offer 笔记 15 | 反转链表

剑指 offer 笔记 15 | 反转链表

作者: ProudLin | 来源:发表于2019-06-19 00:51 被阅读0次

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

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

    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
    来源:牛客网

    相关文章

      网友评论

          本文标题:剑指 offer 笔记 15 | 反转链表

          本文链接:https://www.haomeiwen.com/subject/lqucqctx.html