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)

相关推荐

  • 日志删除脚本怎么写

    技术日志删除脚本怎么写这篇文章主要介绍了日志删除脚本怎么写,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。#!/bin/bashfunction clear

    攻略 2021年11月9日
  • utxo数据模型是什么(什么是utxo账户模型)

    技术比原链扩展性UTXO模型是什么本篇内容主要讲解“比原链扩展性UTXO模型是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“比原链扩展性UTXO模型是什么”吧!用户模型是

    攻略 2021年12月20日
  • 如何读取netcdf数据并在matplotlib Basemap上绘图

    技术如何读取netcdf数据并在matplotlib Basemap上绘图这篇文章主要为大家展示了“如何读取netcdf数据并在matplotlib Basemap上绘图”,内容简而易懂,条理清晰,希望能够帮助大家解决疑

    攻略 2021年12月8日
  • mysql中如何将日期转为时间戳

    技术mysql中如何将日期转为时间戳本篇内容主要讲解“mysql中如何将日期转为时间戳”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql中如何将日期转为时间戳”吧!

    攻略 2021年12月2日
  • 怎样写一个时间序列数据库

    技术怎样写一个时间序列数据库怎样写一个时间序列数据库,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在 Prometheus 上,监控系统包含

    攻略 2021年12月2日
  • 兰因絮果是什么意思,与戚戚意思相似的词语是什么

    技术兰因絮果是什么意思,与戚戚意思相似的词语是什么,语文老师一枚,分享一些能替换一般词汇的高级词汇兰因絮果是什么意思: 1.陌上 陌,原来是田间的小路,后来指代一般的路。所以,陌上就是路上的意思。这是一个古典的词语,古人

    生活 2021年10月24日