既然 题目要求:每 k 个 节点,进行,一次旋转。那我就“截取” k 个节点,将其逆序后,拼接回原链表。
这就是我们的解题思维!
目的一: 这个可以作为 交换 “头节点的前驱节点”
目的二:创建一个 傀儡节点的替身节点prev,方便下一次 做 替换k个节点的 “头节点的前驱节点”
目的三: 原先的头节点,就可以作为 逆序节点中的 “头节点”。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode newHead = new ListNode();// 新建一个傀儡头节点
newHead.next = head;// 将原本的 头节点 head 接入 新头节点的next
ListNode prev = newHead;
while(head!=null){// 如果head为null,说明没有节点需要逆序了
ListNode tail = prev;
// 判断 傀儡节点后面的 节点个数 是否满足 逆序节点个数的要求
for(int i = 0;i < k;i++){
tail = tail.next;
if(tail == null){
return newHead.next;
}
}
ListNode tailNext = tail.next;
ListNode[] reverse = myReverse(head,tail);
head = reverse[0];
tail = reverse[1];
prev.next = head;
tail.next = tailNext;
prev = tail;
head = tail.next;
}
return newHead.next;
}
public static ListNode[] myReverse(ListNode head,ListNode tail){
ListNode pre = tail.next;
ListNode p = head;
while(pre != tail){
ListNode pNext = p.next;
p.next = pre;
pre = p;
p = pNext;
}
return new ListNode[]{tail,head};
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/DarkAndGrey/article/details/122068701
内容来源于网络,如有侵权,请联系作者删除!