1. 程式人生 > 其它 >02.01. 移除重複節點

02.01. 移除重複節點

02.01. 移除重複節點——java解法

02.01. 移除重複節點

1、題目

編寫程式碼,移除未排序連結串列中的重複節點。保留最開始出現的節點。

1)示例1

輸入:[1, 2, 3, 3, 2, 1]
輸出:[1, 2, 3]

2)示例2

輸入:[1, 1, 1, 1, 2]
輸出:[1, 2]

2、初步作答

2.1 思路

  • 建立集合儲存節點中首次出現的整數
  • 比較節點數值是否已存在於集合中,已存在直接刪除節點,不存在直接存入集合

2.2 做法

  • 判斷連結串列頭結點是否為空,為空直接返回頭結點
  • 建立一個 Set 集合
  • 比較節點數值是否已存在於集合中,已存在直接刪除節點,不存在直接存入集合
  • 返回頭結點

2.3 程式碼

/**
 * 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;
        }
        Set<Integer> a = new HashSet<Integer>();
        a.add(head.val);
        ListNode list = head;
        while(list.next != null){
            if(a.add(list.next.val)){
                list = list.next;
            }else{
                list.next = list.next.next;
            }
        }
        list.next = null;
        return head;
    }
}

2.4 思考

因為連結串列的這道題特地去看了一下集合還有連結串列,發現集合真香

3、其餘解法

  • 來自力扣作者:jyd
class Solution {
    public ListNode removeDuplicateNodes(ListNode head) {
        ListNode pre = null, cur = head;
        HashSet<Integer> visited = new HashSet<>();
        while (cur != null) {
            if (visited.contains(cur.val)) {
                pre.next = cur.next;
            }
            else {
                visited.add(cur.val);
                pre = cur;
            }
            cur = cur.next;
        }
        return head;
    }
}