LeetCode:25. K 个一组翻转链表
2022-02-21 本文已影响0人
alex很累
问题链接
问题描述
给你一个链表,每 k
个节点一组进行翻转,请你返回翻转后的链表。
k
是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k
的整数倍,那么请将最后剩余的节点保持原有顺序。
进阶:
- 你可以设计一个只使用常数额外空间的算法来解决此问题吗?
- 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例
解题思路
核心:模拟、链表、指针变换
这道题没有什么复杂的算法,不知道为什么会将难度认定为“困难”。
每次从链表中取k个节点,取出后进行翻转再放回链表;然后再取k个节点...... 如果后面的节点不足k个,结束。
关于翻转的做法:
- 把这k个节点放到list里面,然后从后往前的顺序取节点。
- 纯指针。
代码示例(JAVA)
list
/**
* 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 preHead = new ListNode(-1);
preHead.next = head;
ListNode temp = preHead;
ListNode cur = head;
while (cur != null) {
// 数量校验 、 存下数据到list
ListNode valid = cur;
List<ListNode> list = new ArrayList<>();
for (int i =0; i < k; i++) {
if (valid == null) {
return preHead.next;
}
list.add(valid);
valid = valid.next;
}
// 翻转k个节点
for (int j = list.size() - 1; j >= 0; j--) {
temp.next = list.get(j);
temp = temp.next;
}
temp.next = valid;
cur = valid;
}
return preHead.next;
}
}
执行结果
纯指针
/**
* 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 preHead = new ListNode(-1);
preHead.next = head;
ListNode temp = preHead;
while (head != null) {
// 数量校验
ListNode tail = temp;
for (int i =0; i < k; i++) {
tail = tail.next;
if (tail == null) {
return preHead.next;
}
}
// 翻转数据
ListNode next = tail.next;
ListNode[] nodeArr = reverse(head, tail);
temp.next = nodeArr[0];
nodeArr[1].next = next;
temp = nodeArr[1];
head = nodeArr[1].next;
}
return preHead.next;
}
public ListNode[] reverse(ListNode head, ListNode tail) {
ListNode after = tail.next;
ListNode temp = head;
while (after != tail) {
ListNode next = temp.next;
temp.next = after;
after = temp;
temp = next;
}
return new ListNode[]{tail, head};
}
}
执行结果