单链表反转
链接:leetcode-cn.com/problems/re…
我的思路及题解:
const reverseList = function(head) {
// 特殊情况处理
if(!head || !head.next) return head;
let p = head;
let cur = head.next;
let next = cur.next;
head.next = null;
while(cur) {
// 翻转链表
cur.next = p;
p = cur;
cur = next;
if(!cur) return p; // 翻转完成
next = next.next;
}
return cur;
};
优化一波
const reverseList = function(head) {
// 特殊情况处理
if(!head || !head.next) return head;
let p = head;
let cur = head.next;
head.next = null;
while(cur) {
// 翻转链表
const next = cur.next;
cur.next = p;
p = cur;
cur = next;
}
return p;
};
链表中环的检测
链接(简单):leetcode-cn.com/problems/li…
思路及题解
var hasCycle = function(head) {
if(!head) return false;
let p = head;
let p2 = head;
while(p2.next){
p = p.next;
if(p2.next&&p2.next.next) {
p2 = p2.next.next;
}else{
return false;
}
// 两个指针相遇 链表存在环
if(p === p2) return true;
}
return false;
};
链接(中等):leetcode-cn.com/problems/li…
思路及题解
var detectCycle = function(head) {
if(!head || !head.next) return null;
let p = head;
let p2 = head;
while(p2.next && p2.next.next) {
p = p.next;
p2 = p2.next.next;
// 找到两个指针相遇的位置
if(p2 === p) {
p = head;
// 两指针同时向后遍历,相遇即为入环结点
while(p !== p2) {
p = p.next;
p2 = p2.next;
}
return p;
}
}
return null
};
合并链表
链接: leetcode-cn.com/problems/me…
思路:每次取所有链表中最小的值拼接到新的链表中 题解:
var mergeKLists = function(lists) {
let newlist = new ListNode(null,null);
let p = newlist;
while(hasNode(lists)){
let [min,i] = getSmall(lists);
p.next = min;
p = min;
lists[i] = min.next;
}
return newlist.next
// 判断链表数组中是否还有元素
function hasNode(lists){
for(let i = 0;i<lists.length; i++){
if(lists[i]) return true
}
return false
}
// 获取最小值
function getSmall(lists) {
let min = {
val:Infinity
};
let index = -1;
for(let i = 0;i<lists.length;i++){
if(lists[i] && lists[i].val < min.val){
min = lists[i];
index = i;
}
}
return [min,index];
}
};
删除链表倒数第n个结点
链接:leetcode-cn.com/problems/re…
思路及题解
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
if(!head) return null;
let tail = new ListNode(null,head);
let p = head;
let result = tail;
while(p){
p = p.next;
n--;
if(n < 0) {
result = result.next;
}
}
result.next = result.next.next;
return tail.next;
};