两两交换链表节点
题目:https://leetcode.cn/problems/swap-nodes-in-pairs/
思路:如图

要点:
- 注意加虚拟头节点。使头节点操作与其他节点统一
- 需要保存需要交换的两个元素的前一个元素
- 注意交换的顺序
代码:
var swapPairs = function(head) {
let cur = new ListNode(0,head)
let newHead = cur;
let temp1 =null;
let temp2 =null;
while(cur.next && cur.next.next){
temp1 = cur.next//1
temp2 = cur.next.next.next//1
cur.next = temp1.next//2
cur.next.next = temp1//3
temp1.next = temp2//4
cur = cur.next.next
}
return newHead.next
};
删除链表倒数第N个节点
题目:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
思路:双指针
链表相交
题目:https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/
思路:
- 求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置。
-
比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点(注意不是值相同)
image.png
代码:
var getIntersectionNode = function(headA, headB) {
let n1=0;
let n2=0;
let p1 = headA
let p2 = headB
while(p1){
n1++;
p1=p1.next
}
while(p2){
n2++;
p2=p2.next
}
let count= Math.abs(n1-n2)
console.log(n1)
console.log(n2)
p1=headA;
p2=headB
if(n1 < n2) { // 让p1为最长链表的头,n1为其长度
// 交换变量注意加 “分号” ,两个数组交换变量在同一个作用域下时
// 如果不加分号,下面两条代码等同于一条代码: [p1, p2] = [n2, n1]
[p1, p2] = [p2, p1];
[n1, n2] = [n2, n1];
}
while(count--) { // 让p1和p2在同一起点上(末尾位置对齐)
p1 = p1.next;
}
while(p1){
if(p1===p2){
return p1
}
p1=p1.next
p2=p2.next
}
return null
};

