题目:
给定一个链表,一次反转链表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 }