力扣25题(K 个一组翻转链表)

目录

题目:K 个一组翻转链表

解题思路:

 总代码为:


题目:K 个一组翻转链表

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

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

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

解题思路:

1.因为题中对k有要求,如果节点总数不是 k 的整数倍,则保持原有顺序,所以还需要判断节点数     是否比k大

2.因为题中说每 k 个节点一组进行翻转,所以首先应该找出这一组节点的头节点和尾节点

3.最后将这组数据进行翻转,翻转后接入初始链表中


首先判断链表节点个数:

有三种情况 1:链表节点数为0,即链表没有节点

2:链表节点数<k,此时不需要进行翻转

3:链表节点数>k,此时需要翻转

处于情况1或者2时,则直接返回该链表,即return newHead.next

因此首先应该创建一个头节点head的前驱节点newHead:方便输出链表

(不用头节点head输出链表因为怕该链表为空)

这时还需要创建一个代替newHead的节点prev:用来代替newHead来遍历链表,使newHead始终位置保持不变,方便输出链表


下面画图解释情况3:(假设链表有5个节点)

此时链表节点数>k,需要翻转,因此首先应该找出这一组节点的头节点和尾节点

头节点为head,还需要创建一个尾节点tail

                 

 

 此时需要让tail节点找到所需要翻转的k个节点的尾部(假设k为3)

 

 此时就可以进行翻转了~翻转之后再接入原来的链表中即可

重点:由于翻转之后还要接入原来的链表中,因此我们需要知道tail的后一个节点,所以还需要               建tail的后一个节点tailNext

当然在进行翻转之前,我们需要清楚需要翻转的部分,即head~tail之间的节点

为了防止头节点head被移动,还需创建一个节点p代替head

重点:进行翻转的过程中需要记录p的下一个节点,因此还需要创建一个节点pNext(防止1节点翻转到后面时找不到2节点,因为此时p.next已经指向4节点)

 

 

 

 代码为:

 翻转之后,只需要将翻转之后的链表插入原来的链表即可

 

然后循环遍历寻找k个节点进行翻转即可(直到head为空)

 总代码为:

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode newHead = new ListNode();
        newHead.next = head;
        ListNode prev = newHead;
        ListNode tail = prev;
        while(head!=null){
            for(int i = 0;i < k;i++){
                tail = tail.next;
                if(tail == null){
                    return newHead.next;
                }
            }
            ListNode[] reverse = myReverse(head,tail);

            head = reverse[0];
            tail = reverse[1];
            prev.next = head;
            prev = tail;
            head = tail.next;
        }
        return newHead.next;
    }
    public static ListNode[] myReverse(ListNode head,ListNode tail){
        ListNode tailNext = tail.next;
        ListNode p = head;
        while(tailNext != tail){
            ListNode pNext = p.next;
            p.next = tailNext;
            tailNext = p;
            p = pNext;
        }
        return new ListNode[]{tail,head};
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
判断一个链表是否是另一个链表的子序列是一道常见的问。对于这个问,我们可以使用双指针的方法来解决。双指针一个指向主链表一个指向子序列链表。我们同时遍历两个链表,比较指针指向的节点是否相同。如果相同,我们就同时向后移动两个指针;如果不相同,我们只移动主链表的指针。当子序列链表遍历完毕时,说明所有的节点都匹配成功,那么它是主链表的子序列;如果主链表遍历完毕,而子序列链表还没有遍历完,说明子序列链表中的节点没有完全匹配,那么它不是主链表的子序列。这种方法的时间复杂度是O(n + m),其中n是主链表的长度,m是子序列链表的长度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [力扣之判断一个链表是否是回文链表](https://blog.csdn.net/chenbaifan/article/details/121450273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [[力扣] 203.移除链表元素](https://download.csdn.net/download/weixin_38667920/13759251)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值