問題描述:
給定單向鏈表的頭指針和一個結點指針,定義一個函數在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;
}
}
上述代碼基於一個假設:要刪除的結點的確在鏈表中。