[LeetCode] 25. K 个一组翻转链表(java实现)
1. 题目
2. 读题(需要重点注意的东西)
思路:
① 剩下的节点是否够k个(遍历一遍)
② 剩下的节点够k个的话,将其中的节点全部翻转
注意:此处翻转有三步:
1. 翻转k个节点
2. 改变前置指针
3. 改变末尾指针
③ 判断剩下的节点,如果满足,则执行第2步,否则直接返回dummy(哨兵)即可
3. 解法
---------------------------------------------------解法---------------------------------------------------:
/**
* 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 dummy = new ListNode(-1);
dummy.next = head;
for(ListNode node = dummy;;){
// ①
ListNode cur = node;
int i = 0;
while(cur.next != null && i != k){
i++;
cur = cur.next;
}
// ③
if(cur.next == null && i != k) break;
// ②
else{
ListNode a = node.next,end = cur.next,b = a.next;
ListNode first = a;
while(b != end){
ListNode temp = b.next;
b.next = a;
a = b;
b = temp;
}
node.next = a;
first.next = end;
node = first;
}
}
return dummy.next;
}
}
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
- 链表
6. 总结
翻转链表的扩展