旋转链表(图解说明)

Posted 小海浪.

tags:

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

Leetcode题目描述:
题目链接:旋转链表

题目很简洁,就是移动节点,但其中有隐含的意思,要将链表的每个节点向右移动,使每个节点在新的位置,由于尾结点后面没有了节点,要移动就要形成环,所有的节点在环里面转,移动完后又把环断开,形成新的链表。方法:环形链表+移动

基本思路

  1. 计算链表长度len,因为在求长度的时候我们顺带找了链表的最后一个节点,最后一个节点的长度没算,所以len的起始值为1.
    2.观察发现对链表的操作每len次循环一次,计算k % len可有效减少操作链表的次数(如果链表长度为3,你将链表的每个节点移动4个位置,其实只是将每个节点移动了1个位置)
  2. 找到链表尾节点,修改其next指针,将链表连接成循环链表 ,在求长度的时候就可以同时将链表变为循环链表了
  3. 从尾节点循环遍历链表,直至找到旋转后链表的尾节点,将其next域置为null,从此处断开循环链表 并且返回新的头节点,从尾巴节点遍历len-k%len次即可以找到新链表的尾巴节点了,进而找到头节点。

图示分析:

我们可以通过一个例子或几个例子类推出,移动节点后找到头节点前驱的条件。

动图演示:

上面这题是我刷题的一点笔记与总结,链表解题方式多样,我这个只是一种基本的方法。这种方法也很简单,不像使用双指针法那么难想,这种方法仅供向我一样的小白参考。
参考代码:

public Node rotateRight(Node  head, int k) {
        if (head == null || head.next == null) {
            return head;
        }
        int len=1;
        int index;
        Node  temp = head;
        Node newHead;
        while (temp.next != null) { //计算链表长度len,这里的条件是找到了最后一个节点,最后一个节点没有计算,所以len从1开始
            len++;
            temp = temp.next;
        }
        /*
        平常我们求长度,是遍历整个链表,求长度的条件应该为temp!=null,但这一题我们上面的代码既求了长度也找到了链表的最后一个节点,
    使最后一个节点的next 域指向了头结点形成了一个环,当然你也可以按正常地的求链表的长度,但之后要多费一道手续再找到链表的尾结点。
        int len=0;
        while (temp!=null) {
            len++;
            temp=temp.next;
        }*/
        temp.next = head; //将链表连接成循环链表
        k %= len; //旋转链表每len次循环一次,因此计算k对len的取余,避免重复操作
        index = len - k; //
        while (index-- > 0) {
            temp = temp.next;//找到要断开循环链表的节点,
        }
        newHead = temp.next;//纪录链表新的头结点
        temp.next = null; //断开循环链表
        return newHead;
    }

🛣️过🉐小🧑🏽‍🤝‍🧑🏼,记🉐点👍🏻🍹持👇🏻,🦀🦀

以上是关于旋转链表(图解说明)的主要内容,如果未能解决你的问题,请参考以下文章

合并两个有序链表 图解说明

图解 Google V8 # 05:函数表达式的底层工作机制

学习数据结构笔记(12) --- [平衡二叉搜索树(AVLTREE)]

链表数据结构图解 和 代码实现

处理屏幕旋转上的片段重复(带有示例代码)

使用 ActionBar 旋转 Android 的双片段