首页 > 其他分享 >61. 旋转链表

61. 旋转链表

时间:2024-07-14 16:08:28浏览次数:15  
标签:head ListNode val next 链表 61 旋转 节点

61. 旋转链表

错误代码

/**
 * 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; }
 * }
 */
class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        ListNode dummy = new ListNode(0, head);
        ListNode node = dummy;
        for(int i = 0;i < k; i++) {
            if (node.next != null) {
                node = node.next;
            } else {
                node = head;
            }
        }
        ListNode cutNode = node.next;
        node.next = null;
        cutNode = this.reverse(cutNode);
        cutNode.next = dummy.next;
        return dummy.next;
    }

    private ListNode reverse(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode dummy = new ListNode(0, head);
        ListNode pre = dummy;
        ListNode cur = head;
        while (cur != null) {
            ListNode nxt = cur.next;
            cur.next = pre;
            pre = cur;
            cur = nxt;
        }
        return dummy.next;
    }
}

首先理解题目有误,以为是需要将断点后的链表翻转再接上头节点。
另外翻转链表也写错了。。
翻转链表也不需要dummy节点,因为实际头节点会发生变更,而不是原来的头节点。、
以下为AI分析:

代码的目的是实现链表的右旋转操作,但实现中存在几个关键错误,导致代码无法正确完成旋转任务。下面是错误的详细分析和正确的旋转实现方法。

错误分析

  1. 旋转逻辑错误:代码试图通过切割和反转链表的一部分来实现旋转,这与旋转链表的正确逻辑不符。正确的旋转操作应该是将链表的后部分移动到前面来,而不是反转链表的一部分。

  2. k 的处理:如果 k 大于链表的长度,应该先对 k 进行取模操作,以确保旋转的步数不超过链表的长度。代码中没有处理这一点。

  3. 反转操作不应该出现:在旋转链表的任务中,不需要反转链表的任何部分。代码中的 reverse 方法不应该被使用。

正确的旋转链表方法

下面是一个正确实现链表右旋转操作的代码示例:

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; }
}

class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if (head == null || head.next == null || k == 0) {
            return head;
        }
        
        // 计算链表长度并获取尾节点
        int length = 1;
        ListNode tail = head;
        while (tail.next != null) {
            tail = tail.next;
            length++;
        }
        
        // 连接尾节点与头节点,形成环
        tail.next = head;
        
        // 计算新的尾节点位置
        k = k % length;
        int stepsToNewHead = length - k;
        ListNode newTail = tail;
        while (stepsToNewHead-- > 0) {
            newTail = newTail.next;
        }
        
        // 获取新的头节点,并断开环
        ListNode newHead = newTail.next;
        newTail.next = null;
        
        return newHead;
    }
}

代码解释

  1. 特殊情况处理:如果链表为空、只有一个节点或 k 为0,直接返回原链表。

  2. 计算链表长度:遍历链表以计算其长度,并在此过程中获取尾节点。

  3. 形成环:将尾节点的 next 指向头节点,形成一个环。

  4. 计算新的头节点和尾节点:根据 k 的值计算新的头节点的位置。由于是右旋转,新的头节点实际上是从链表尾部向前数 k 个节点的位置。

  5. 断开环:在新的尾节点处断开环,得到旋转后的链表。

这种方法正确处理了链表的右旋转操作,无需反转链表的任何部分。

标签:head,ListNode,val,next,链表,61,旋转,节点
From: https://www.cnblogs.com/qianingmeng/p/18301666

相关文章

  • 物体旋转
    调置旋转角度时,一般使用localEulerAngles,而不是rotation给物体调转一个旋转角度。1、Quaternion四元组(x,y,z,w)transform.rotation=...不便操作,官方不建议使用2、欧拉角EulerAngletransform.eulerAngles=newVector3(0,45,0);transform.localEulerAn......
  • 题解:CodeForces 618C Constellation[贪心/模拟]
    CodeForces618CC.Constellationtimelimitpertest:2secondsmemorylimitpertest:256megabytesinputstandardinputoutputstandardoutputCatNokuhasobtainedamapofthenightsky.Onthismap,hefoundaconstellationwithnstarsnumberedfrom......
  • 力扣-81. 搜索旋转排序数组 II
    1.题目题目地址(81.搜索旋转排序数组II-力扣(LeetCode))https://leetcode.cn/problems/search-in-rotated-sorted-array-ii/题目描述已知存在一个按非降序排列的整数数组nums,数组中的值不必互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上......
  • 力扣·33. 搜索旋转排序数组
    1.题目题目地址(33.搜索旋转排序数组-力扣(LeetCode))https://leetcode.cn/problems/search-in-rotated-sorted-array/题目描述整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[n......
  • 5 SAP前台操作手册-PP模块-计划独立需求(PIR)创建、修改(删除)、显示(MD061,MD62,MD63
    0总体说明SAP实施项目中,到了第3个阶段-系统实现,在这个阶段,因为蓝图汇报已经结束,配置也差不多完成了,自开发还在进行中,SAP标准功能下,可以进行基础业务的前台操作了,在实现阶段的末端,客户指定的关键用户(俗称KU-KeyUser)会进行前台业务操作和练习,提高熟练程度,同时需要在外部SAP顾......
  • 82. 删除排序链表中的重复元素 II
    82.删除排序链表中的重复元素II是一个有序链表错误代码classSolution{publicListNodedeleteDuplicates(ListNodehead){ListNodedummy=newListNode();dummy.next=head;while(head!=null&&head.next!=null){i......
  • LCR 024. 反转链表
    LCR024.反转链表1、迭代这段代码是一个用于反转单链表的Java类。下面是对代码的详细解释:classSolution{publicListNodereverseList(ListNodehead){ListNodeprev=null;//初始化前一个节点为null,因为反转后链表的最后一个节点的next应该是null......
  • [20240618]Oracle C functions annotations.txt
    [20240618]OracleCfunctionsannotations.txt--//网站orafun.info可以查询oraclecfunctions.CreatedbyFritsHooglandwithalittlehelpfromKamilStawiarski.--//可以通过它了解oracle内部C函数.实际上可以直接下载相关文件,在本地使用.https://gitlab.com/FritsHoog......
  • 热血江湖SF发布网-热血江湖SF发布网-热血江湖SF发布网61
           热血江湖SF发布网-热血江湖SF发布网-热血江湖SF发布网26       热血江湖SF发布网-热血江湖SF发布网-热血江湖SF发布网热血江湖SF发布网-热血江湖SF发布网-热血江湖SF发布网热血江湖SF发布网-热血江湖SF发布网-热血江湖SF发布网    ......
  • 数据结构与算法学习day4之单向链表
    1.单向链表的的定义链表是有序的列表,这是它在内存中的存储,如下图所示:链表是以节点的形式存储的,是链式存储每个节点都包含两个部分,一个是data域,一个是next域指向下一个节点每个节点不一定是连续存储链表分为带头节点和不带头节点2.单向链表的实现思路(1)添加添加节点的......