剑指 Offer 18. 删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
题意分析 查找列表符合条件的节点,如果存在就删除,返回删除后的节点;如果不存在,则返回原链表
- 定义一个变量存储当前节点
- 链表中的存储的是索引地址,如果操作原链表,会直接修改原链表的值
- 遍历链表,如果当前节点的值等于目标值,则删除并挑出循环,返回原节点,否则指向下一个节点
测试用例 输入: head = [4, 5, 1, 9], val = 5 输出: [4, 1, 9] 解释: 给定你链表中值为5的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
var deleteNode = function(head, val) {
if (head?.val === val) {
return head.next
}
let currentNode = head
while (currentNode?.next) {
if (currentNode.next.val === val) {
currentNode.next = currentNode.next.next || null
break
}
currentNode = currentNode.next
}
return head
};
剑指 Offer 22. 链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
题意理解 返回链表倒数几个值(节点数从1开始,而不是数组索引0开始)
- 定义一个变量存储当前节点,一个变量统计链表节点总数count
- 遍历链表,统计节点个数
- 如果K>count,返回原链表
- 否则返回指向第count -k个节点
测试用例 示例: 给定一个链表: 1->2->3->4->5, 和 k = 2. 返回链表 4->5.
var getKthFromEnd = function(head, k) {
let currentNode = head;
let count = 1;
while (currentNode?.next) {
count++;
currentNode = currentNode.next
}
if (k >= count) {
return head
}
currentNode = head;
while (count > k) {
count--;
currentNode = currentNode.next
}
return currentNode
}
两个指针
var getKthFromEnd = function(head, k) {
let fast = head,
slow = head;
while (fast && k > 0) {
[fast, k] = [fast.next, k - 1];
}
while (fast) {
[fast, slow] = [fast.next, slow.next];
}
return slow;
};