(Java bezieht sich auf Angebot) Löschen Sie doppelte Knoten in der verknüpften Liste

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

Ich denke du magst

Origin blog.csdn.net/nanhuaibeian/article/details/108592220
Empfohlen
Rangfolge