zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    OpenFire源码学习之十九:在openfire中使用redis插件(上)
    OpenFire源码学习之十八:IOS离线推送
    OpenFire源码学习之十七:HTTP Service插件
    OpenFire源码学习之十六:wildfire
    OpenFire源码学习之十五:插件开发
    OpenFire源码学习之十四:插件管理
    OpenFire源码学习之十三:消息处理
    数据挖掘入门
    iOS小技巧
    图片加载完成之前对图片高度侦测
  • 原文地址:https://www.cnblogs.com/xuzhiyuan/p/7659588.html
Copyright © 2011-2022 走看看