Leetcode 25. Reverse Nodes in k-Group
题目描述:就是在前一题翻转2个链表节点的题目上变成翻转k个位置。
题目链接:Leetcode 25. Reverse Nodes in k-Group
Example:
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
代码如下
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if (head == null && k == 0){
return head;
}
ListNode p = head;
ListNode ans = new ListNode(0);
ListNode nl = ans;
while(p != null){
int cnt = 0;
ListNode newHead = null;
while(cnt < k && p != null){
ListNode tmpn = p.next; //翻转链表 必存节点
p.next = newHead;
newHead = p; // 翻转链表了 当cnt == k的时候就翻转成功了
p = tmpn; //移动 k次之后 是需要翻转的下一个结点
cnt++;
}
if (cnt == k){
nl.next = newHead;
while(nl.next != null){
nl = nl.next; // 最终又回到这个点
}
}else{
// 记录的时候已经改变了位置 所以直接翻转newHead结果就好了
ListNode nn = null; //新头节点
while(newHead != null){
ListNode tt = newHead.next;
newHead.next = nn;
nn = newHead;
newHead = tt; // 不断下移翻转
}
nl.next = nn;
}
}
return ans.next;
}
}