1. 程式人生 > >左程雲著演算法與資料結構題目最優解筆記-刪除無序連結串列中重複的元素

左程雲著演算法與資料結構題目最優解筆記-刪除無序連結串列中重複的元素

刪除無序連結串列中重複的元素

方法1:使用雜湊表,時間複雜度O(n),空間複雜度O(n)
方法2:類似選擇排序的過程,時間複雜度O(n^2),空間複雜度O(1);

方法1

過程如下:
1. 生成一個雜湊表,因為頭節點不用刪除,所以先將頭節點存入雜湊表中
2. 從頭節點的下一個節點開始遍歷,每遍歷到一個節點,記錄當前節點cur和它上一個節點pre。先檢查cur是否在雜湊表中,如果存在則刪除cur節點,如果不存在則存入雜湊表中。操作完之後移動到下一個節點。

程式碼塊

public class Node {
    public int val;
    public
Node next; public Node (int val){ this.val=val; } } public void removeRep1(Node head){ if(head==null) return ; HashSet<Integer> set =new HashSet<Integer>(); Node pre=head; Node cur=head.next; set.add(head); while(cur!=null){ if(set.contains(cur.val)){ pre.next=cur.next; }else
{ pre=cur; set.add(cur); } cur=cur.next; } }

方法2

依次檢查每個節點的重複值,首先是頭節點,記錄頭節點為當前節點cur,遍歷頭節點之後的所有節點,如果有相同的節點則刪除。檢查完頭節點接著檢查下一個節點,直到檢查完所有節點為止。

程式碼塊

public class Node {
    public int val;
    public Node next;
    public Node (int val){
        this.val=val;
    }
}
public
void removeRep2(Node head){ if(head==null) return ; Node pre=null; Node cur=head; Node next=null; while(cur!=null){ pre=cur; next=cur.next; while(next!=null){ if(cur.val==next.val){ pre.next=next.next; }else { pre=next; } next=next.next; } cur=cur.next; } }