1

Können Sie erklären, warum nicht immer mein Code alle Werte in der verknüpften Liste entfernt, die dem gegebenen Wert in den Methodenargumenten entsprechen? Wie soll ich es beheben? Es besteht 97% der Testfälle. Ich bevorzuge es, dies zu beheben, anstatt die gesamte Methode mit den Prev/Next/Dummy-Zeigern zu ändern.Entfernen aller Werte in der verketteten Liste gleich einem gegebenen Wert

/** 
* Definition for singly-linked list. 
* public class ListNode { 
*  int val; 
*  ListNode next; 
*  ListNode(int x) { val = x; } 
* } 
*/ 
public class Solution { 
    /** 
    * @param head a ListNode 
    * @param val an integer 
    * @return a ListNode 
    */ 
    public ListNode removeElements(ListNode head, int val) { 
     while (head!=null && head.val==val){ 
       head = head.next; 
     } 
     ListNode tmp=head; 

     while (tmp!=null) { 
       if (tmp.next!=null && tmp.next.val== val) { 
        tmp.next=tmp.next.next; 
       } 
      tmp=tmp.next; 
     } 
     if (tmp != null) { 
      if (tmp.val == val) { 
       tmp = tmp.next; 
      } 
     } 
     return head; 
    } 
} 

Es ist nicht diesen Testfall nicht passiert:

Input 
5->6->6->null, 6 
Output 
5->6->null 
Expected 
5->null 

und hier ist the problem in mehreren Details: Given 1->2->3->3->4->5->3, val = 3, you should return the list as 1->2->4->5

+2

Haben Sie versucht, den Debugger zu verwenden, um zu sehen, was mit Ihrem Code passiert? –

+0

Ich hatte, das Problem hatte keine Ahnung, wie das zu beheben, ohne prev Zeiger zu verwenden, aber ich wollte auch das Problem mit dem gleichen Code beheben, an dem ich arbeitete! Ich wusste, dass, wenn die zu entfernenden Objekte nebeneinander sind, mein Code nicht funktioniert –

Antwort

5

In Ihrer inneren while-Schleife ändern:

if (tmp.next!=null && tmp.next.val== val) { 
    tmp.next=tmp.next.next; 
} 

bis

while (tmp.next!=null && tmp.next.val== val) { 
    tmp.next=tmp.next.next; 
} 

Ihre Version wird die Sekunde jedes aufeinander folgenden zu entfernenden Wertepaares überspringen. Was Sie tun:

5-> 6-> 6-> null

-tmp: 5 -> entfernen Sie zuerst 6, dann setzen tmp auf den zweiten 6

-tmp: 6, tmp. nächste: null -> fertig (ein 6 Reste)

+0

Ich bin beeindruckt! Vielen Dank! :) –

Verwandte Themen