首页 > 代码库 > Leetcode25--->Reverse Nodes in k-Group(以k个节点为段,反转单链表)

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             else47                 break;48         }49         return newHead;50     }51 }

 

Leetcode25--->Reverse Nodes in k-Group(以k个节点为段,反转单链表)