Remove Duplicate Node LCCI

Write code to remove duplicates from an unsorted linked list.

Example1:

 Input: [1, 2, 3, 3, 2, 1]
 Output: [1, 2, 3]

Example2:

 Input: [1, 1, 1, 1, 2]
 Output: [1, 2]

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/remove-duplicate-node-lcci
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
 import java.util.*;
 import java.util.stream.Collectors;
class Solution {
    public ListNode removeDuplicateNodes(ListNode head) {
        List<Integer> list = new ArrayList();
        ListNode node = head;
        while(node != null) {
            list.add(node.val);
            node = node.next;
        }
        List<Integer> list1 = list.stream().distinct().collect(Collectors.toList());
        ListNode root = new ListNode(-1);
        ListNode cursor = root;
        for (int i = 0; i < list1.size(); i++) {
            ListNode sumNode = new ListNode(list1.get(i));
            cursor.next = sumNode;
            cursor = sumNode;
        }
        return root.next;
    }
}

運行結果:運行效率有點低。
在這裏插入圖片描述

:每次寫到鏈表都要想想怎麼構建一個鏈表。
總結下:經典6步。

    // 1、創建一個新的鏈表root 
 	ListNode root = new ListNode(-1);
 	// 2、將新的鏈表root賦值給再新創建的鏈表cursor。(這一步必須理解)
    ListNode cursor = root;
    for (int i = 0; i < list1.size(); i++) {
    	// 3、創建新節點sumNode
        ListNode sumNode = new ListNode(list1.get(i));
        // 4、將新節點賦值給鏈表cursor的下一步。(本質是改變root)
        cursor.next = sumNode;
        // 5、當前節點sumNode賦值給cursor保存
        cursor = sumNode;
    }
    // 6、返回鏈表root.next
    return root.next;

老是說上面的方法不是唯一,只是效率比其他的高些。
裏面對第一次接觸的人會有些不理解。
可以發現上面我們沒有對root做賦值操作。但結果確實改變變了。這個要從引用說起。
例子:

package com.design.bridage;

class Main {

    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        StringBuilder sbTmp = sb;
        sbTmp.append("改變了");
        String str = new String();
        String strTmp = str;
        strTmp = "nihao";
        System.out.println(sb.toString());
        System.out.println(strTmp);
    }
}

運行結果:
在這裏插入圖片描述
理由:StringBuilder sbTmp = sb; sbTmp 保存的是sb引用,你改變sbTmp,就改變了sb。道理類似這個鏈接喲😄🙂

還有經典的頭插法和尾插法:

   //從頭節點插入,比較簡單不用遍歷鏈表
   // head 鏈表   newNode 新節點
    public static void insetFromHead(Node head,Node newNode){
        newNode.next=head;
        head = newNode;
    }

    //在尾部插入,要遍歷鏈表
    // head 鏈表   newNode 新節點
    public static void insertFromTail(Node head1, Node newNode){
        Node temp = head1; //用temp代替head去遍歷找到最後一個節點,一定不要用head自己去遍歷,不然就找不到鏈表頭了
        while (temp.next!=null){
            temp=temp.next;
        }
        temp.next=newNode;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章