两两交换链表中的节点
leetcode链接:leetcode.cn/problems/sw…
涉及到链表的都先画图,再写代码:
为什么需要一个临时指针变量?
因为cur.next指向新节点后,就获取不到原来的cur.next节点了
要注意,步骤1中的的cur.next.next在步骤2中变成了cur.next
var swapPairs = function(head) {
let dummy = new ListNode(0, head);
let cur = dummy;
while (cur.next && cur.next.next) {
// 步骤1
let temp = cur.next;
cur.next = cur.next.next;
// 步骤2
temp.next = cur.next.next;
cur.next.next = temp;
cur = temp;
}
return dummy.next;
};
删除链表的倒数第N个节点
leetcode链接:leetcode.cn/problems/re…
这道题目可以使用两种方法来解,推荐学习和使用双指针
方法一:双指针
如何找到第n个节点?
快指针先移动n步,然后快慢指针一起移动,直到快指针指向了空节点,此时慢指针就指向了要删除的节点
但此时有个问题,如果要删除第n个节点,肯定需要知道被删除节点的前一个节点,为了让慢指针指向被删除节点的前一个节点,快指针需要走n+1步
var removeNthFromEnd = function(head, n) {
let dummy = new ListNode(0, head);
let slow = dummy;
let fast = dummy;
// 快指针走n+1步
n++;
while (n-- && fast) {
fast = fast.next;
}
// 快慢指针一起移动,直到快指针指向空节点
while (fast) {
fast = fast.next;
slow = slow.next;
}
// 删除节点
slow.next = slow.next.next;
return dummy.next;
};
方法二:模拟
删除倒数第n个,那就是删除正数第size-n+1个
首先获取链表的长度:
// 获取链表的长度
let size = 0;
let temp = head;
while (temp) {
size++;
temp = temp.next;
}
然后遍历链表,使得cur指针指向要删除节点的前一个节点:
let dummy = new ListNode(0, head);
let cur = dummy;
let i = 0;
while (cur && cur.next) {
i++;
if (i === (size - n + 1)) {
cur.next = cur.next.next;
}
cur = cur.next;
}
最后,返回dummy.next