LeeCode-刷题日记-Day26
25. K 个一组翻转链表
思路:k个节点为一次翻转,则需要记录每次翻转的前驱节点和翻转的后继节点。同时翻转链表能提供头和尾方便链接。
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
*/
var reverseKGroup = function(head, k) {
let pre=new ListNode(0);
pre.next=head;
let p=pre;
while(head){
let tail=p;
for(let i=0;i<k;++i){
tail=tail.next;
if(!tail)
return pre.next;
}
let next=tail.next;
[head,tail]=Reverse(head,tail);
p.next=head;
tail.next=next;
p=tail;
head=tail.next;
}
return pre.next;
};
function Reverse(head,tail){
let last=tail.next;
let p=head;
while(last!==tail){
let next=p.next;
p.next=last;
last=p;
p=next;
}
return [tail,head];
}
143. 重排链表
思路:将链表的每个节点加入队列中,每次从队头和队尾取元素。将他们连接起来。最后将最后一个节点的next至为null;
var reorderList = function(head) {
if(head===null) return head;
let p=head;
let queue=[];
while(p){
queue.push(p);
p=p.next;
}
while(queue.length>2){
let pre=queue.shift();
let tail=queue.pop();
tail.next=pre.next;
pre.next=tail;
}
queue[queue.length-1].next=null;
return head;
};
- 本文链接:https://archer-lan.github.io/2023/11/20/LeeCode-%E5%88%B7%E9%A2%98%E6%97%A5%E8%AE%B0-Day26/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。