//题目描述:
//给定单项链表的头节点和一个节点的指针,定义一个函数在O(1)时间内上删除该节点。
//解题思路:
//常规的删除操作是遍历整个链表,找到要删除的节点和他的前一个节点,把前一个节点的next指向要删除节点的下一个节点。这样做到了删除操作。
//但是这样的时间复杂度为O(n);因为链表自带下一个节点的地址,所以我们能够立即找到目标节点的下一个节点next。用下一个节点next把目标节点覆盖;
//这样就能立马做到删除操作。
//但是这样有两个特例:
//1.如果删除的节点是尾节点的话,还是需要顺序遍历整个链表来操作。
//2.如果删除后链表没有节点了,即链表只有一个节点,即head是要删除的节点。 这样就需要把head指向null。
public class Solution
{
public ListNode deleteNode(ListNode head,ListNode beDelete)
{
//如果给的头节点为空,返回空
if (head == null)
return null;
//删除一个空节点返回原来的头节点
if (beDelete == null)
return head;
//要删除的节点不为尾节点
if (beDelete.next != null)
{
ListNode next = beDelete.next;
beDelete.value = next.value;
beDelete.next = next.next;
}
//是尾节点的话先判断链表的头结点是不是要删除的节点;是的话把head指向空。
// 不是的话顺序遍历找到上一个结点,并把上一个结点的next置为空。
else
{
if (head == beDelete)
head = null;
ListNode pre = head;
while (pre.next != beDelete)
{
pre = head.next;
}
pre.next = null;
}
return head;
}
}
07-17
103