25.k组中的反向节点(25.Reverse Nodes in k-Group)

题目:

给定一个链表,一次反转链表k的节点并返回其修改的列表。

k是正整数,小于或等于链表的长度。如果节点的数量不是k的倍数,则最后的剩余节点应保持原样。

您不能更改节点中的值,只有节点本身可能会更改。

只允许恒定的内存。

例如,
给定这个链表:1->2->3->4->5

对于k = 2,您应该返回:2->1->4->3->5

对于k = 3,您应该返回:3->2->1->4->5

 

思路:

(1)若k<=1则说明链表不需要进行倒置,那么只需返会此链表即可;

(2)每次将链表的前k个节点倒置,剩下未倒置的节点变为一个从k+1个节点开始的新链表,然后递归求解这个新链表,直到链表的长度小于k则返会此链表;
(3)若k=2;只需将相邻的节点倒置即可,剩下的节点变为一个头节点为k+1个节点的新链表;然后递归求解新链表;
(4)若k>2;令i=2;temp1每次指向头节点的下一个节点(即ListNode temp1=head.next);temp2每次指向temp1的下一个节点(即ListNode temp2=temp1.next);然后令temp1指向头节点即                   (temp1.next=head);然后将head变为temp1,temp1变为temp2(即head=temp1;temp1=temp2);直到i=k-1;时将temp1指向head,head指向temp1;
(5)最后返回head;

 

代码:

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) { val = x; }
 7  * }
 8  */
 9 
10 /*
11 思路:(1)若k<=1则说明链表不需要进行倒置,那么只需返会此链表即可;
12 (2)每次将链表的前k个节点倒置,剩下未倒置的节点变为一个从k+1个节点开始的新链表,然后递归求解这个新链表,直到链表的长度小于k则返会此链表;
13 (3)若k=2;只需将相邻的节点倒置即可,剩下的节点变为一个头节点为k+1个节点的新链表;然后递归求解新链表;
14 (4)若k>2;令i=2;temp1每次指向头节点的下一个节点(即ListNode temp1=head.next);temp2每次指向temp1的下一个节点(即ListNode temp2=temp1.next);然后令temp1指向头节点即(temp1.next=head);然后将head变为temp1,temp1变为temp2(即head=temp1;temp1=temp2);直到i=k-1;时将temp1指向head,head指向temp1;
15 (5)最后返回head;
16 */
17 class Solution {
18     public ListNode reverseKGroup(ListNode head, int k) {
19         
20         if(listNodeSize(head)<k||k<=1){//若链表节点数量小于k,或者k=1时都直接返回head
21             
22             return head;
23             
24         }
25         
26         ListNode temp1=head.next;//链表的下一个节点
27         
28         if(k==2){//如果k=2则只需将链表的前两个节点相互交换位置,然后递归求解剩下位交换的链表
29             
30             head.next=reverseKGroup(head.next.next,k);
31             temp1.next=head;
32             head=temp1;
33             
34         }else{//若k>2只需
35             
36             head.next=reverseKGroup(listNodeKNext(head,k),k);//原链表头节点的下一个节点为k+1个节点变为头节点的新链表递归求解的解
37             
38             for(int i=2;i<k;i++){
39                 
40                 ListNode temp2=temp1.next;
41                 temp1.next=head;
42                 head=temp1;
43                 temp1=temp2;
44                 
45                 if(i==(k-1)){
46                     
47                     temp1.next=head;
48                     head=temp1;
49                     
50                 }
51             }
52         }
53         
54         return head;
55         
56     }
57     
58     //链表节点数量
59     public int listNodeSize(ListNode head){
60         
61         int nums=0;
62         ListNode temp=head;
63         while(temp!=null){
64             
65             nums++;
66             temp=temp.next;
67             
68         }
69         
70         return nums;
71     }
72     
73     //返回链表第K个节点的下一个节点
74     public ListNode listNodeKNext(ListNode head,int k){
75         
76         ListNode temp=head;
77         int nums=1;
78         while(temp!=null){
79             
80             if(nums==k){
81                 
82                 break;
83                 
84             }
85             
86             nums++;
87             temp=temp.next;
88         }
89         
90         return temp.next;
91         
92     }
93 }

 

posted @ 2017-10-13 09:46  xzy不会飞的地板流  阅读(391)  评论(0编辑  收藏  举报