題目:給定單向鏈表的頭指針和一個節點指針,定義一個函數在O(1)時間刪除該節點。
思路:
要刪除的節點i,先把i的下一個節點j的內容複製到i,然後把i的指針指向節點j的下一個節點。此時再刪除節點j,其效果剛好是把節點i給刪除了。
上述問題還有一個問題;如果要刪除的節點位於鏈表的尾部,那麼它就沒有下一個節點,怎麼辦?我們讓然從鏈表的頭節點開始,順序遍歷得到該節點的前序節點,並完成刪除操作。
最後需要注意的是,如果鏈表中只有一個節點,而我們又要 鏈表的頭節點(也是尾節點),此時我們在刪除節點之後,還需要把鏈表的頭節點設置爲NULL。、
java實現:
public class ListNode {
int val;
ListNode next=null;
ListNode(){
}
ListNode(int val){
this.val=val;
}
ListNode(int val,ListNode next){
this.val=val;
this.next=next;
}
}
public class DeleteNode {
public static void deleteNode(ListNode head,ListNode node) {
if(head==null||node==null) return;
//要刪除的不是尾結點
if(head.next!=null) {
node.val=node.next.val;
node.next=node.next.next;
}
//鏈表只有一個結點,刪除頭結點
else if(head==node) {
head=null;
}
//鏈表有多個結點,要刪除的是尾節點,從頭遍歷到尾
else {
while(head.next!=node) {
head=head.next;
}
head.next=null;
}
}
public static void main(String[] args) {
ListNode tail=new ListNode(1,null);
ListNode c=new ListNode(2,tail);
ListNode b=new ListNode(3,c);
ListNode head=new ListNode(4,b);
deleteNode(head,c);
while(head!=null) {
System.out.println(head.val);
head=head.next;
}
}
}