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