【面接問題02.01】重複ノードの削除


タイトル
タイトルリンクはコードを記述し、ソートされていないチェーンテーブルの重複ノードを削除します.最初に表示されたノードを保持します.
例1:
  :[1, 2, 3, 3, 2, 1]
  :[1, 2, 3]

例2:
   :[1, 1, 1, 1, 2]
   :[1, 2]

ヒント:
1.      [0, 20000]   。
2.      [0, 20000]   。

実現構想.
考え方1:問題を読み終わったらすぐに上手になり、これは簡単すぎると思います.set集合を利用して重複するデータをフィルタし、頭挿し法を利用して新しいチェーンテーブルを構築します.コードは次のとおりです.

/**
 * Definition for singly-linked list.
 * public class ListNode {
 * int val;
 * ListNode next;
 * ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeDuplicateNodes(ListNode head) {
        if (head == null) {
            return head;
        }
        ListNode h = head;
        ListNode temp = new ListNode(0);
        ListNode root = temp;
        HashSet hashSet = new HashSet<>();
        while (h != null) {
            hashSet.add(h.val);
            h = h.next;
        }
       //         
        for (int n : hashSet) {
            ListNode p = new ListNode(n);
            temp.next = p;
            temp = p;
        }
        return root.next;
    }
}

その結果、hashsetが無秩序であることを忘れ、出力されたデータが昇順に配列されていることを忘れました.だからgg、値が合わない.考えを変える.
考え方2:hashsetを利用するか、チェーンテーブルをループしてhashsetに次のノードのvalが存在する場合、次のノードを削除します.さもないと下を遍歴し続けると、重くなることができます.
コードは次のとおりです.

/**
 * Definition for singly-linked list.
 * public class ListNode {
 * int val;
 * ListNode next;
 * ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeDuplicateNodes(ListNode head) {
        if (head == null) {
            return head;
        }
        HashSet hashSet = new HashSet<>();
        ListNode p = head;
        //       hashset 
        hashSet.add(p.val);
        //        
        while (p.next != null) {
            //  hashset    next   val        next          next   val            next    next next
            if (!hashSet.add(p.next.val)) {
                p.next = p.next.next;
            } else {
                p = p.next;
            }
        }
        return head;
    }
}