劍指offer編程題Java實現——面試題13在O(1)時間內刪除鏈表節點


題目:給定單向鏈表的頭指針和一個節點指針,定義一個函數在O(1)時間刪除該節點。

由於給定的是單向鏈表,正常刪除鏈表的時間復雜度是查找鏈表的時間復雜度即O(n),如果要求在O(1)時間復雜度內刪除節點,通過遍歷鏈表找到該節點的上一節點和下一節點的方法是行不通了。所以實現的思路是,根據給定的要刪除的節點,可以直接找到其后年的節點,把后面的節點的內容復制到當前節點處,同時將當前節點指向其后面節點的后面節點保證鏈表不斷開,再把下一節點刪掉就相當於把給定的節點刪除了。

需要考慮到的一點是,如果要刪除的節點是鏈表的尾節點的話,那還是需要從頭結點按照順序遍歷到尾節點的前一節點,然后刪除尾節點,總的平均時間復雜度就是[(n-1)*1+O(n)]/n,結果還是O(1)。

 

 1 /**
 2  * 劍指offer面試題13:在O(1)時間刪除鏈表節點
 3  * 題目:給定單向鏈表的頭指針和一個節點指針,定義一個函數在O(1)時間刪除該節點。
 4  * @author GL
 5  *
 6  */
 7 public class No13DeleteNodeInList {
 8 
 9     public static class ListNode{
10         public int data;
11         public ListNode next;
12         public ListNode(int data,ListNode next){
13             this.data=data;
14             this.next=next;
15         }
16     }
17 
18     public static void deleteNode(ListNode head,ListNode node){
19         //刪除尾節點,采用順序查找找到尾節點的前一節點
20         if(node.next==null){
21             while(head.next!=node){
22                 head=head.next;
23             }
24             head.next=null;
25         }
26         //要刪除的節點是頭結點
27         else if(head==node){
28             head=null;
29         }
30         //要刪除的節點是中間普通節點
31         else{
32             node.data=node.next.data;
33             node.next=node.next.next;
34         }
35     }
36     public static void main(String[] args) {
37         ListNode tail=new ListNode(1,null);
38         ListNode c=new ListNode(2,tail);
39         ListNode b=new ListNode(3,c);
40         ListNode head=new ListNode(4,b);
41         deleteNode( head,c);
42         while(head!=null){
43             System.out.println(head.data);
44             head=head.next;
45         }
46 
47     }
48 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM