27.删除链表的节点
题目:
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
题解:
- 当删除节点为头节点时,返回头节点的next节点;
- 遍历链表找到需删除的节点,调整next值,实现删除节点。
public ListNode deleteNode(ListNode head, int val) {
if (head.val == val) return head.next;
ListNode res = head;
ListNode temp = new ListNode(0);
while (head.val != val){
temp = head;
head = head.next;
}
temp.next = head.next;
return res;
}
28.链表中倒数第k个节点
题目:
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
题解一(栈):
- 将所有节点入栈,再出栈返回第k个节点。
public ListNode getKthFromEnd(ListNode head, int k) {
Stack<ListNode> stack = new Stack<>();
ListNode temp = head;
ListNode res = new ListNode(0);
while (temp != null){
stack.push(temp);
temp = temp.next;
}
for (int i = 0; i < k; i++)
res = stack.pop();
return res;
}
题解二(双指针):
- 使用快慢指针
slow
和fast
,维持一个长度为k的区间; - 如果fast未到达链表的尾部,即fast != null,则快慢指针同时向后移动;
- 如果fast到达链表的尾部,即fast == null,返回slow即可。
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode slow = head;
ListNode fast = head;
for (int i = 0; i < k; i++){
fast = fast.next;
}
while (fast != null){
slow = slow.next;
fast = fast.next;
}
return slow;
}
你是建筑工人的儿子,实惠比体面重要。—《人世间》