leetcode之反转链表图文详解

Posted icdat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode之反转链表图文详解相关的知识,希望对你有一定的参考价值。

206-反转链表

题目:

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

思路:

迭代法:

新建一个链表的头部,循环遍历旧链表的结点,将其加到新链表的后面

递归法

代码:(迭代法)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode new=null;//新建一个结点,依此来作为新表的尾结点
        ListNode p = head;//新建一个结点p,指向head的第一个结点
        while(!head){
            ListNode tmp = p.next;//tmp用来暂时存放p.next
            p.next=new;/*将p(旧链表的的第一个结点)指向新结点,即p成为了新链表的第一个结点;同时注意这里将p.next的值改变,所以需要上一步暂时存放剩下旧链表的第一个结点*/
            new=p;/*将新链表的头指针始终指向新链表的第一个结点*/
            p=tmp;/*将剩下的旧链表的第一个结点赋值给p*/
        }
        return new;
    }
}

(递归法):

/**
 * 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;
      }
      else{
          ListNode p = head.next;//a
          ListNode rehead = reverseList(p);//b
          p.next = head;//c
          head.next=null;//d
          return rehead;              
        }
    }
}

递归法详解:(参考上代码)

次数 head p
0 1 2
1 2 3
2 3 4
3 4 5
4 5 null

上图表示的是递归次数对应的head,p值

  • 首先进if判断,不符合然后进else,执行到a处时,即表上次数为0时图示为:

技术分享图片

  • 然后递归,在最后一层递归的时候,进终止递归判断的时候,即次数为4图示为:

技术分享图片

然后返回head

  • 返回后次数为3,p为返回的head=5 此时的图示为:

技术分享图片

详解次数为3的情况:

  • 执行b完时图示为:

技术分享图片

  • 继续执行,执行完c时的图示为:

    技术分享图片

    • 继续执行,执行完d时的图示为:

      技术分享图片

      然后返回rehead

返回后的次数为2,即head为3,p为4,执行完b后的图示:

技术分享图片

依次执行c、d等操作,等次数为0执行完d时就完成了链表的反转了:

技术分享图片

这么看来rehead即为反转后的链表的第一个结点,至此反转结束。

以上是关于leetcode之反转链表图文详解的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode-链表经典习题(206-反转链表)图文详解

《LeetCode之每日一题》:287.反转链表

《LeetCode之每日一题》:136.反转链表

《LeetCode之每日一题》:287.反转链表

java算法leetcode_对话之反转链表

java算法leetcode_对话之反转链表