leetcode排序链表怎么用(leetcode单链表反转)

技术LeetCode如何k个一组翻转链表这篇文章给大家分享的是有关LeetCode如何k个一组翻转链表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 题目描述:给你一个链表,每 k 个节点一组

这篇文章是关于LeetCode如何在k的组中翻转链表的,我觉得边肖很实用,所以分享给大家作为参考。让我们跟着边肖看一看。

00-1010会给你一个链表,每k个节点翻转一次。请返回翻转的链接列表。

k是一个正整数,其值小于或等于链表的长度。

如果节点总数不是k的整数倍,请将最后剩余的节点保持在原始顺序。

00-1010给你这个链表:1-2-3-4-5。

当k=2时,应该返回: 2-1-4-3-5。

当k=3时,应该返回: 3-2-1-4-5。

描述:

您的算法只能使用恒定的额外空间。

不能只改变节点的内部值,需要实际交换节点。

题目描述:

步骤分解:

链表分为要翻转的部分、要翻转的部分和不要翻转的部分。每次翻转前,应确定翻转链表的范围。这是为了确定需要通过k周期记录的已翻转链表的前驱和后继。翻转后方便连接翻转部分和未翻转部分。最初,需要两个变量pre和end。pre表示待翻转链表的前驱,end表示k周期内待翻转链表的结束。当end到达end时,记录下一个next=end.next翻转链表,然后连接三个链表,然后重置pre和end指针,然后进入下一个循环的特例。当翻转部分长度小于K时,定位结束后,end==null已经到达结束,表示话题已经完成,直接返回时间复杂度可以是O(n*K),最好的情况是O(n

空间复杂度为O(1),除了几个必要的节点指针,我们不占用任何其他空间。

LeetCode如何k个一组翻转链表

示例:

#定义链接列表。

#classListNode(对象):

#def__init__(self,x):

#self.val=x

#自我。下一个=无

类别解决方案(对象):

defreverseKGroup(自我,头部,k):

哑=列表节点(0)

nbsp; p = dummy
        while True:
            count = k 
            stack = []
            tmp = head
            while count and tmp:
                stack.append(tmp)
                tmp = tmp.next
                count -= 1
            # 注意,目前tmp所在k+1位置
            # 说明剩下的链表不够k个,跳出循环
            if count : 
                p.next = head
                break
            # 翻转操作
            while stack:
                p.next = stack.pop()
                p = p.next
            #与剩下链表连接起来 
            p.next = tmp
            head = tmp
        
        return dummy.next


 
 

java实现:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if (head == null || head.next == null){
            return head;
        }
        //定义一个假的节点。
        ListNode dummy=new ListNode(0);
        //假节点的next指向head。
        // dummy->1->2->3->4->5
        dummy.next=head;
        //初始化pre和end都指向dummy。pre指每次要翻转的链表的头结点的上一个节点。end指每次要翻转的链表的尾节点
        ListNode pre=dummy;
        ListNode end=dummy;

        while(end.next!=null){
            //循环k次,找到需要翻转的链表的结尾,这里每次循环要判断end是否等于空,因为如果为空,end.next会报空指针异常。
            //dummy->1->2->3->4->5 若k为2,循环2次,end指向2
            for(int i=0;i<k&&end != null;i++){
                end=end.next;
            }
            //如果end==null,即需要翻转的链表的节点数小于k,不执行翻转。
            if(end==null){
                break;
            }
            //先记录下end.next,方便后面链接链表
            ListNode next=end.next;
            //然后断开链表
            end.next=null;
            //记录下要翻转链表的头节点
            ListNode start=pre.next;
            //翻转链表,pre.next指向翻转后的链表。1->2 变成2->1。dummy->2->1
            pre.next=reverse(start);
            //翻转后头节点变到最后。通过.next把断开的链表重新链接。
            start.next=next;
            //将pre换成下次要翻转的链表的头结点的上一个节点。即start
            pre=start;
            //翻转结束,将end置为下次要翻转的链表的头结点的上一个节点。即start
            end=start;
        }
        return dummy.next;


    }
    //链表翻转
    // 例子:   head:1->2->3->4
    public ListNode reverse(ListNode head) {
         //单链表为空或只有一个节点,直接返回原单链表
        if (head == null || head.next == null){
            return head;
        }
        //前一个节点指针
        ListNode preNode = null;
        //当前节点指针
        ListNode curNode = head;
        //下一个节点指针
        ListNode nextNode = null;
        while (curNode != null){
            nextNode = curNode.next;//nextNode 指向下一个节点,保存当前节点后面的链表。
            curNode.next=preNode;//将当前节点next域指向前一个节点   null<-1<-2<-3<-4
            preNode = curNode;//preNode 指针向后移动。preNode指向当前节点。
            curNode = nextNode;//curNode指针向后移动。下一个节点变成当前节点
        }
        return preNode;

    }


}

感谢各位的阅读!关于“LeetCode如何k个一组翻转链表”这篇文章就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/146804.html

(0)

相关推荐

  • 儒林外史王冕,儒林外史人物故事及性格

    技术儒林外史王冕,儒林外史人物故事及性格儒林外史人物故事性格儒林外史王冕:王冕
    1.王冕是历史上真实存在的人物,作者据此进行了改编。王冕在小说中具有重要的作用,在整个小说的人物塑造上,他奠定了作者理想人物的基本特点,正如

    生活 2021年10月21日
  • Go调度器是如何处理线程阻塞的

    技术Go调度器是如何处理线程阻塞的本篇内容主要讲解“Go调度器是如何处理线程阻塞的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go调度器是如何处理线程阻塞的”吧!怎么让我们

    攻略 2021年11月19日
  • SpringBoot应用程序使用Gradle配置脚本中的版本号

    技术SpringBoot应用程序使用Gradle配置脚本中的版本号 SpringBoot应用程序使用Gradle配置脚本中的版本号在Gradle构建系统时设置了项目的版本号,使用SpringBoot开发

    礼包 2021年12月16日
  • STM32单片机I/O的工作模式有哪些

    技术STM32单片机I/O的工作模式有哪些这篇文章主要讲解了“STM32单片机I/O的工作模式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“STM32单片机I/O的

    攻略 2021年11月5日
  • dw怎么制作asp动态网页以及向数据库增加记录

    技术dw怎么制作asp动态网页以及向数据库增加记录dw怎么制作asp动态网页以及向数据库增加记录,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。下面给大家介绍

    攻略 2021年12月2日
  • 怎样才是好代码

    技术怎样才是好代码 怎样才是好代码这是我一直都在思考的问题,或者说是我对怎么样才是一个好的程序员的思考。
    场景
    任何问题以及工具的使用,不讨论其应用场景,无疑是耍流氓。我这里讨论的对象主要是从事互联网开

    礼包 2021年11月1日