题目描述:
给定一个链表的头指针和要删除的结点指针,要求用O(1)时间复杂度删除结点。
思路:
- 如果删除的结点是尾结点,先找到尾结点的前驱节点,然后删除;
- 如果删除的结点不是尾结点,将要删除的结点的val值赋值为后继结点的val值,删除后继结点即可。
参考代码:
public static ListNode deleteNode(ListNode head, ListNode toBeDeleted) {
if(head == null || toBeDeleted == null)return head;
if(head == toBeDeleted)return head.next;
if(toBeDeleted.next == null){//说明是尾结点
//找到前驱节点
ListNode p = head;
while(p.next != null && p.next != toBeDeleted){
p = p.next;
}
if(p.next == toBeDeleted)p.next = null;
}
else{//不是尾结点
toBeDeleted.val = toBeDeleted.next.val;
toBeDeleted.next = toBeDeleted.next.next;
}
return head;
}
(完)