链表翻转类型题:
初级:
ts
const reverse = (head: ListNode ) =>{
let dummy = new ListNode();
dummy.next = haed;
let cur = head;
while(cur){
let nxt = cur.next;
cur.next = pre;
pre = cur;
cur = nxt;
}
return dummt.next;
}
中级:
https://leetcode.cn/problems/reverse-linked-list-ii/description/
ts
function reverseBetween(head: ListNode | null, left: number, right: number): ListNode | null {
let dummy = new ListNode();
dummy.next = head;
let p0 = dummy;
for(let i=0;i<left-1;i++){ // 使用p0找到翻转节点的前一个节点
p0 = p0.next;
}
// 移动一下cur
let cur = p0.next; // cur是翻转节点的第一个节点
let pre = null; // 翻转节点的前一个节点
for(let i=0;i<right-left+1;i++){
let nxt = cur.next
cur.next = pre;
pre = cur;
cur = nxt;
}
// p0指的是翻转节点的前一个节点
// 对照样例,p0.next是2
// 2应该指向5, 此时cur是5,所以 p0.next.next = cur
p0.next.next = cur;
p0.next = pre;
return dummy.next;
};
高级:
- k个一组翻转链表
ts
function reverseKGroup(head: ListNode | null, k: number): ListNode | null {
let dummy = new ListNode();
dummy.next = head;
let cur = head;
let n = 0;
// 获取长度
while(cur){
n++;
cur = cur.next;
}
// 分组,确定次数
let len = Math.floor(n/k);
let p0 = dummy;
for(let i=0;i<len;i++){
let pre = null; // 重置
cur = p0.next; // 每一轮的cur是p0的下一个节点
for(let i=0;i<k;i++){
let nxt = cur.next; // 交换三步走,同上一题
cur.next = pre;
pre = cur;
cur = nxt;
}
let nxt = p0.next; // 本轮交换的第一个节点,是下一次交换的上一个节点,也就是下一次交换的p0;
p0.next.next = cur; // 重置p0的next. 具体指向参考上一题:
p0.next = pre; // 重置cur
p0 = nxt; // 同 let nxt = p0.next;;
}
return dummy.next;
};