一、需求
- 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
- 返回删除后的链表的头节点。
二、单指针法
2.1 思路分析
- 判断头结点是否为空,为空则直接返回null;
- 判断待删除的元素是否为链表的头结点,如果是,则返回后面的所有结点;
- 不是1,2情况的话,遍历链表,确定待删除结点之前的结点位置,这样方便删除,通过判断当前结点的下一个结点是否为最后一个结点,若不是,就判断是否为待删除的结点,若不是待删除的结点,那么移动当前结点至下一结点;
- 退出循环后,若找到了,就以链表的特性删除结点。
2.2 代码实现
class Solution {
public ListNode deleteNode(ListNode head, int val) {
if(head == null) return null;
if(head.val == val) return head.next;
ListNode cur = head;
while(cur.next != null) {
if(cur.next.val != val) {
cur = cur.next;
} else {
break;
}
}
//下面的循环作用于上面循环相同
/*
while(cur.next != null && cur.next.val != val) {
cur = cur.next;
}
*/
if(cur.next != null) {
cur.next = cur.next.next;
}
return head;
}
}
2.3 复杂度分析
- 时间复杂度为O(n);
- 空间复杂度为O(1)。