解题思路
如果删除的节点为 head,那么我们需要对返回值做特殊处理,为了避免这样的特殊处理,我们使用一个虚拟头节点 dummyHead,并让 dummyHead 的 next 指针指向 head。这样一来,无论删除的节点是否为头节点,我们都返回 dummyHead.next 即可。
算法流程:
维护两个指针:pre,cur
初始化:
- pre = dummyHead
- cur = head
当 cur.val != val 时,pre,cur 指针同时向后移动
当遍历到 cur.val == val 时,让 pre.next 指向 cur.next,并让 cur.next 指向空值,跳出循环,返回 dummyHead.next
代码
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/class Solution {public ListNode deleteNode(ListNode head, int val) {ListNode dummyHead = new ListNode(-1);dummyHead.next = head;ListNode cur = head;ListNode pre = dummyHead;while(cur != null){if(cur.val == val){pre.next = cur.next;cur.next = null;break;}else {cur = cur.next;pre = pre.next;}}return dummyHead.next;}}
复杂度分析
- 时间复杂度:O(N)
N 为链表长度,最差的情况为删除的节点为链表最后一个节点,时间复杂度为 O(N)
- 空间复杂度:O(1)
dummyHead,cur,pre 占用常数大小的额外空间
