问题描述:
给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:
public class ListNode{ int value; ListNode next; public ListNode(int v){ value = v;}}
思路:常规的做法就是遍历链表找到被删除结点的前趋p,然后改变p->next的指向即可。但是这种做法的时间复杂度为O(n)。
因此我们要另寻他路。现在我们已知了要删除的结点指针,那么我们很容易获得它的后继,那么显然我们,我们可以直接将其后继内容放在该结点上,然后删除后继结点即可
public void deleteNode(ListNode head, ListNode pToBeDeleted){ if(head == null || pToBeDeleted == null){ return; } ListNode q = pToBeDeleted->next; //要删除的不是尾结点 if(q != null){ pToBeDeleted->value = q -> value; pToBeDelted->next = q->next; q = null; } //链表只有一个结点,删除头结点(也是尾节点) else if(head == pTobeDeleted){ pToBeDeleted = null; head = null; }else{ //链表中有多个结点,删除尾结点 ListNode q = head; while(q -> next != pToBeDeleted){ q = q -> next; } q -> next = null; pToBeDeleted = null; }}
上述代码基于一个假设:要删除的结点的确在链表中。