Technologieaustausch

Likous angeordnete Deduplizierung verknüpfter Listen

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Löschen Sie doppelte Elemente in der verknüpften Liste und behalten Sie ein doppeltes Element bei

Seite 1
1 -> 1 -> 2 -> 3 -> 3 -> null

p1.val == p2.val und dann p2 löschen. Beachten Sie, dass p1 zu diesem Zeitpunkt unverändert bleibt

Seite 1
1 -> 2 -> 3 -> 3 -> null

p1.val != p2.val Dann bewegen sich p1, p2 rückwärts

Seite 1
1 -> 2 -> 3 -> 3 -> null
         
Seite 1
1 -> 2 -> 3 -> 3 -> null

p1.val == p2.val, dann p2 löschen

Seite 1
1 -> 2 -> 3 -> null

Wenn p2 == null ist, wird die Schleife verlassen

Code

  1. public ListNode deleteDuplicates(ListNode head) {
  2. // 链表节点 < 2
  3. if (head == null || head.next == null) {
  4. return head;
  5. }
  6. // 链表节点 >= 2
  7. ListNode p1 = head;
  8. ListNode p2;
  9. while ((p2 = p1.next) != null) {
  10. if (p1.val == p2.val) {
  11. p1.next = p2.next;
  12. } else {
  13. p1 = p1.next;
  14. }
  15. }
  16. return head;
  17. }

Behalten Sie keine doppelten Elemente bei

p1 ist der vorherige zu löschende Knoten. Jeder Zyklus vergleicht die Werte von p2 und p3.

  • Wenn die Werte von p2 und p3 wiederholt werden, bewegt sich p3 weiter zurück, bis ein Knoten gefunden wird, der nicht mit p2 dupliziert wird, und p1 zeigt auf p3, um den Löschvorgang abzuschließen.

  • Wenn sich die Werte von p2 und p3 nicht überlappen, werden p1, p2 und p3 um eine Position nach hinten verschoben und der obige Vorgang wird fortgesetzt.

  • p2 oder p3 ist null, verlassen Sie die Schleife

    • Wenn p2 beispielsweise null ist, ist die verknüpfte Liste 1 1 1 null

 

Seite 1 Seite 2 Seite 3
s, 1, 1, 1, 2, 3, null

p1 p2 p3
s, 1, 1, 1, 2, 3, null

p1 p2 p3
s, 1, 1, 1, 2, 3, null

Seite 1 von 3
s, 2, 3, null

Seite 1 Seite 2 Seite 3
s, 2, 3, null

p1 p2 p3
s, 2, 3, null

Code

  1. public ListNode deleteDuplicates(ListNode head) {
  2. if (head == null || head.next == null) {
  3. return head;
  4. }
  5. ListNode s = new ListNode(-1, head);
  6. ListNode p1 = s;
  7. ListNode p2;
  8. ListNode p3;
  9. while ((p2 = p1.next) != null && (p3 = p2.next) != null) {
  10. if (p2.val == p3.val) {
  11. while ((p3 = p3.next) != null
  12. && p3.val == p2.val) {
  13. }
  14. p1.next = p3;
  15. } else {
  16. p1 = p1.next;
  17. }
  18. }
  19. return s.next;
  20. }