算法思路:
- 特判:如果头节点就是要删除的节点,直接返回头节点的下一个节点。
- 初始化指针p和q,p指向头节点,q指向头节点的下一个节点。
- 循环遍历,直到q指向要删除的节点或者q为空。
- p和q同步前进。
- p的next指向q的下一个节点,实现删除q节点。
- 返回头节点。
时间复杂度:O(n),空间复杂度:O(1)。
/**
* 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) {
//特判:如果头节点就是要删除的节点,直接返回头节点的下一个节点
if (head.val == val){
return head.next;
}
//初始化指针p和q,p指向头节点,q指向头节点的下一个节点
ListNode p = head,q = head.next;
//循环遍历,直到q指向要删除的节点或者q为空
while (q != null && q.val != val){
//p和q同步前进
p = p.next;
q = q.next;
if (q == null) return head;
//如果链表中没有值等于val的节点,q会遍历到链表尾部,变为null。
//在这种情况下,p.next = q.next这一行代码会导致NullPointerException。
//因为当q变为null时,q.next也是null,我们无法对其进行赋值操作
}
//p的next指向q的下一个节点,实现删除q节点
p.next = q.next;
//返回头节点
return head;
}
}