Leetcode #25 Reverse Nodes in k-Group K区间链表交换 解题报告

1 解题思想

昨天在写组内交换的时候我就说了,肯定有K组版的,结果就是今天啊。。嗯,因为我写的和做的不同步,所以已经不记得题目顺序了。那么在看今天的之前,可以先去回顾下昨天的,今天的是昨天的推广版,昨天的可以理解为今天的K=2的特殊情况。
Leetcode #24. Swap Nodes in Pairs 链表节点交换 解题报告

所以题目的意思也就是说,给定一个链表,每K个为一个小组,小组内的顺序进行翻转颠倒,如果不足K个的那一组,就什么都不做。

这套题的做法其实也很简单,两个指针,slower和faster,faster比slower快k步,然后没走k步,将slower和faster之间的做一个翻转就好。这道题关键在于细节之处,如何处理链表。

所以解题方法就是:
1、slower+faster双指针
2、细心!如果一会儿想不通,对于链表的题,用笔自己画下是最好的

2 原题

25. Reverse Nodes in k-Group
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

You may not alter the values in the nodes, only nodes itself may be changed.

Only constant memory is allowed.

For example,
Given this linked list: 1->2->3->4->5

For k = 2, you should return: 2->1->4->3->5

For k = 3, you should return: 3->2->1->4->5

3 AC解


public class Solution {
 public ListNode reverseKGroup(ListNode head, int k) {
        if(k==1)
            return head;
        //首先需要一个slower和faster,分别指向当前第一个开始之前,和第k个的结束为止
        ListNode prehead,slower,faster,pbefore,p,pnext,newslower;
        prehead=new ListNode(0);
        prehead.next=head;
        slower=prehead;
        faster=prehead.next;
        //计数
        int count=0;
        while(faster!=null){
          count++;
          //依次将方向调转,然后扭转前后的slower和faster
          if(count==k){
              pbefore=slower.next;
              p=pbefore.next;
              newslower=slower.next;
              for(int i=0;i<k-1;i++){
                pnext=p.next;
                p.next=pbefore;
                pbefore=p;
                p=pnext;
              }
              newslower.next=p;
              slower.next=pbefore;
              slower=newslower;
              faster=slower;
              count=0;
          }
         // if(faster!=null)
              faster=faster.next;
        }
        return prehead.next;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值