Artikelverzeichnis
1. Fragenanalyse
In einer sortierten verknüpften Liste gibt es doppelte Knoten. Bitte löschen Sie die doppelten Knoten in der verknüpften Liste, die doppelten Knoten werden nicht beibehalten und der Kopfzeiger der verknüpften Liste wird zurückgegeben. Beispielsweise wird die verknüpfte Liste 1-> 2-> 3-> 3-> 4-> 4-> 5 als 1-> 2-> 5 verarbeitet
Der Schlüssel zu dieser Frage besteht darin, die Möglichkeit zu berücksichtigen, dass der erste Knoten und der zweite Knoten dupliziert werden. Sie müssen also zuerst einen Kopfknoten hinzufügen, und nachfolgende Beurteilungen können den Vorzeiger hinzufügen, um den Vorläufer anzuzeigen, und den letzten Zeiger, um anzuzeigen, dass der Arbeitszeiger für die nachfolgende Suche verantwortlich ist
Zweitens der Code
public class Test_14 {
public static void main(String[] args) {
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(1);
ListNode node3 = new ListNode(1);
ListNode node4 = new ListNode(1);
ListNode node5 = new ListNode(1);
ListNode node6 = new ListNode(1);
ListNode node7 = new ListNode(1);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
node6.next = node7;
ListNode result = deleteDuplication(node1);
while (result != null) {
System.out.println(result.val);
result = result.next;
}
}
private static ListNode deleteDuplication(ListNode pHead) {
if (pHead == null || pHead.next == null) {
return pHead;
}
//首先添加一个头结点,防止出现第一个和第二个结点就相同的情况
ListNode head = new ListNode(0);
head.next = pHead;
//pre 指向当前确定不重复的结点,last 表示工作结点,负责往后搜索
ListNode pre = head;
ListNode last = pHead;
while (last != null) {
ListNode temp = last.next;
if (temp != null && last.val == temp.val) {
while (temp != null && last.val == temp.val) {
temp = temp.next;
}
pre.next = temp;
last = temp;
} else {
pre = pre.next;
last = temp;
}
}
return head.next;
}
}
Drei, Zusammenfassung
Zum Löschen der verknüpften Liste werden im Allgemeinen zwei Zeiger verwendet, ein Vorläufer und ein Arbeitszeiger