24. 两两交换链表中的节点
题目链接:24. 两两交换链表中的节点
解题思路🧐
为了不再单独处理头结点,使用虚拟头结点。
代码⌨️
var swapPairs = function(head) {
let ret = new ListNode(0, head), temp = ret;
while (temp.next && temp.next.next) {
let cur = temp.next.next, pre = temp.next;
pre.next = cur.next;
cur.next = pre;
temp.next = cur;
temp = pre;
}
return ret.next;
};
总结👀
注意两两交换指针间的操作先后顺序。
19.删除链表的倒数第N个节点
题目链接:19.删除链表的倒数第N个节点
解题思路🧐
链表遍历用双指针法。如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。
1、依然使用虚拟头节点。
2、fast指针移动时,走n+1步,确保同时移动时slow指针指向删除节点的上一个节点。
3、fast、slow指针同时移动,直到fast指针指向null。
4、删除slow指针的下一个节点。
代码⌨️
var removeNthFromEnd = function(head, n) {
let ret = new ListNode(0, head),
slow = fast = ret;
while(n--) fast = fast.next;
while(fast.next !== null) {
fast = fast.next;
slow = slow.next
};
slow.next = slow.next.next;
return ret.next;
};
总结👀
注意fast指针n+1步的原因。
面试题 02.07. 链表相交
题目链接面试题 02.07. 链表相交
解题思路🧐
理解错误的点:交点不是数值相等,而是指针相等。 为了方便举例,假设节点元素数值相等,则节点指针相等。 思路:求出两条链表的长度,使两链表末尾对齐。比较指针curA和curB。如果不相同,curA和curB同时向后移动,若curA == curB,找到交点。否则返回空指针。
代码⌨️
var getListLen = function(head) {
let len = 0, cur = head;
while(cur) {
len++;
cur = cur.next;
}
return len;
}
var getIntersectionNode = function(headA, headB) {
let curA = headA, curB = headB,
lenA = getListLen(headA),
lenB = getListLen(headB);
if(lenA < lenB) {
[curA, curB] = [curB, curA];
[lenA, lenB] = [lenB, lenA];
}
let i = lenA - lenB;
while(i-- > 0) {
curA = curA.next;
}
while(curA && curA !== curB) {
curA = curA.next;
curB = curB.next;
}
return curA;
};
142.环形链表II
题目链接142.环形链表II
解题思路🧐
主要考察两知识点:
- 判断链表是否环
- 如果有环,如何找到这个环的入口
代码⌨️
var detectCycle = function(head) {
if(!head || !head.next) return null;
let slow =head.next, fast = head.next.next;
while(fast && fast.next && fast!== slow) {
slow = slow.next;
fast = fast.next.next;
}
if(!fast || !fast.next ) return null;
slow = head;
while (fast !== slow) {
slow = slow.next;
fast = fast.next;
}
return slow;
};
var detectCycle = function(head) {
if(!head || !head.next) return null;
let slow =head.next, fast = head.next.next;
while(fast && fast.next) {
slow = slow.next;
fast = fast.next.next;
if(fast == slow) {
slow = head;
while (fast !== slow) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
return null;
};
今日总结
训练营第四天~
今天的链表相交和环形链表题目都考察了解题的思维和细节,真的很重要!
第五天休息,第六天也要加油鸭!😺