zoukankan      html  css  js  c++  java
  • Leetcode25--->Reverse Nodes in k-Group(以k个节点为段,反转单链表)

    题目: 给定一个单链表,一次反转k个节点,最终返回翻转后的链表的头节点;如果链表不足k个,则不变

    举例:

    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

    解题思路:

    1.  首先要确定链表的头节点newHead;即如果链表的节点个数大于k,则头节点为第k个节点;否则头节点不变;

    2.  区分每一段,即确定段的开始和结尾;当前段的开始start, 段的结尾可以用k确定;下一段的开始为end;

    3.  每k个节点之间的反转;

    4.  段与段之间的连接,prevNode指向前一段的最后一个节点;

     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 public class Solution {
    10     public ListNode reverseKGroup(ListNode head, int k) {
    11         if(head == null || k <= 1)
    12             return head;
    13         ListNode begin = head; // begin是当前段的开始
    14         ListNode end = begin;  // end是下一段的开始
    15         ListNode newHead = begin;  // 新的链表头
    16         ListNode prevNode = head;  // 是上一段的最后一个节点
    17         int flag = 0;  // 记录是第几段
    18         while(end != null){
    19             int count = 1;
    20             while(end.next != null && count < k){
    21                 end = end.next;
    22                 count ++;
    23             }
    24             if(count == k){
    25                 if(flag == 0){
    26                     newHead = end;
    27                 }
    28                 flag ++;
    29                 if(flag > 1){  // 不是第一段时就需要段与段之间的连接
    30                     prevNode.next = end;  // 段和段之间进行连接
    31                     prevNode = begin;
    32                 }
    33                 end = end.next;  // 下一个段的开始
    34                 ListNode prev = null;
    35                 int i = 0;
    36                 while(i < k){  // 链表的反转
    37                     ListNode nextNode = begin.next;
    38                     begin.next = prev;
    39                     prev = begin;
    40                     begin = nextNode;
    41                     i++;
    42                 }
    43                 begin = end;   // 下一个段的开始
    44                 prevNode.next = end;  // 两个段之间连接,是为了避免下一段节点数不足k个,则不能使用第30行代码来连接段
    45             }
    46             else
    47                 break;
    48         }
    49         return newHead;
    50     }
    51 }
  • 相关阅读:
    聊聊Flame Graph(火焰图)的那些事
    Dynamometer:HDFS性能扩展测试工具
    论分布式系统中单一锁控制的优化
    聊聊磁盘数据的损坏
    分级副本存储:一种更具效益成本的数据容错策略
    分布式存储系统中的Data Scrubbing机理
    论一个成熟分布式系统的工具类设计
    聊聊Raft一致性协议以及Apache Ratis
    ListenableFuture的状态同步和原子更新
    2018-9-1-win10-uwp-轻量级-MVVM-框架入门-2.1.5.3199
  • 原文地址:https://www.cnblogs.com/leavescy/p/5879917.html
Copyright © 2011-2022 走看看