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;
}