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

你可能感兴趣的:(LeetCode,链表,反转,交换)