[剑指offer]面试题 13:在 O(1) 时间删除链表结点
tag: ``
leetcode: LCR 136. 删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
关键实现
1.删除节点,即需要知道当前被删除的节点,以及上一个节点
2. 修改指针,移除当前
3. 或者将后一个指针复制给当前,即修改当前节点的值与next,并修改当前节点的地址
public ListNode deleteNode(ListNode head, int val) {
// 边界 head 为空, head 1个
// 功能 包含
// 异常 不包含
// 删除, 将当前节点找到,并把上一个节点指针指向当前的next
// 本质问题,如何获取
if (head == null) {
return head;
}
if (head.val == val) {
ListNode newHead = head.next;
head.next = null;
return newHead;
}
ListNode root = head;
ListNode c = head;
ListNode pre = null;
while (c != null) {
if (c.val == val) {
// 命中,移除,要看 pre是否为空
pre.next = c.next;
return root;
}
pre = c;
c = c.next;
}
// 没命中
return null;
}

被折叠的 条评论
为什么被折叠?



