IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LC61.旋转链表 -> 正文阅读

[数据结构与算法]LC61.旋转链表

题目

查看题目

解题思路

初步的想法是定义两个链表,copy_list是初始链表的一个复制,因为本道题的想法是模拟一个环,但是直接定义环不现实。观察题目,第一个元素向右移动的时候,链表的末尾的元素会因为第一个元素的移动而被”挤“到前面来,当向右移动两个元素的时候,末尾的倒数两个元素会到前面来,这就考虑使用复制链来查找倒数第N个元素,找到后将找到的链连接到原始链中,然后将原始链中的倒数N个元素删除,完成操作。对于移动的步数,要先记录链表的长度,然后进行一次取余操作,获取最终的移动步数。
不出意外的话就一定会出意外,上面的初步想法果然有问题,我设想的用一条复制链其实在理论上是绝对可以实现的,但是我写的时候将新链指向head,实际上这根本不是一条新链,在所谓的”复制链”上的任何操作都会影响原始的head的链,这就是我为什么一直报空指针的错误了(因为将倒数第N位取走了,如果N超过N/2,就会导致原始的head链找不到倒数第N个元素,fast指针一定会跑到null.next中去,导致出现问题)也正是这个错误给了我启发,为何不直接在一条链上进行操作呢,直接将倒数第N个元素所在的链移动到head之前不不就齐活了,事实证明这样确实是可行的,除了上面这些点,其他思想和初步想法一样,包括定义一个连接指针,用来连接head(将找到的倒数第N个元素所在的链添加到头部位置),其实说白了这个题的核心就是:找倒数第N位元素+链表合并(最简单的合并)

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
 //初步的想法是定义两个链表,copy_list是初始链表的一个复制,因为本道题的想法是模拟一个环,但是直接定义环不现实。观察题目,第一个元素向右移动的时候,链表的末尾的元素会因为第一个元素的移动而被”挤“到前面来,当向右移动两个元素的时候,末尾的倒数两个元素会到前面来,这就考虑使用复制链来查找倒数第N个元素,找到后将找到的链连接到原始链中,然后将原始链中的倒数N个元素删除,完成操作。对于移动的步数,要先记录链表的长度,然后进行一次取余操作,获取最终的移动步数。
class Solution {
    //查找倒数第N个元素

    public ListNode rotateRight(ListNode head, int k) {
        
        if(head==null) return null;
        if(head.next==null) return head;
        if(k==0) return head;
        //用来记录链表的长度
        int sum=0;
        ListNode sum_test=head;
        while(sum_test!=null){
            sum_test=sum_test.next;
            sum++;
        }
        // System.out.print(sum);
        //获取最终的移动步数
        int n=k%sum;
        if(n==0) return head;
        //定义链表的复制链表,找到倒数第N个元素,并进行断链操作
        ListNode summy=new ListNode(-1);
        ListNode copy_list=head;
        summy.next=copy_list;
        ListNode copy_fast=summy;
        ListNode copy_low=summy;
        ListNode copy_break=summy;
        int tmp=n;
        while(tmp!=0){
            copy_fast=copy_fast.next;
            tmp--;
        }
        while(copy_fast!=null){
            copy_low=copy_low.next;
            copy_fast=copy_fast.next;
        }//此时copy_low已经找到了倒数第N个元素起始的链表了
        //下面进行断链
        while(copy_break.next!=copy_low){
            copy_break=copy_break.next;
        }
        copy_break.next=null;//完成断链
        //定义连接指针,用来链接此链与原始链
        ListNode touch=copy_low;
    
        while(touch.next!=null){
            touch=touch.next;//找到链表中的最后一个元素并定位在这
        }
        //下面对原始链进行操作.
        //下面进行两个链表的拼接,由于复制链表定义的连接指针,这里直接连接指针直接指向summy_ori.next即可
        touch.next=summy.next;

        //返回copy_low
        return copy_low;
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-09 19:49:07  更:2021-11-09 19:53:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:32:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码