面試題13:在O(1)時間內刪除鏈表結點

題目:給定單向鏈表的頭指針和一個節點指針,定義一個函數在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;
		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章