1

Можете ли вы объяснить, почему не всегда мой код удаляет все значения в связанном списке, равные заданному значению в аргументах метода? Как его исправить? Он пропускает 97% тестовых ящиков. Я предпочитаю исправить это, а не изменять весь метод, используя указатели prev/next/dummy.Удаление всех значений в связанном списке равным заданному значению

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

Он не проходит этот TestCase:

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

и здесь более подробно the problem: Given 1->2->3->3->4->5->3, val = 3, you should return the list as 1->2->4->5

+2

Вы пытались использовать отладчик, чтобы узнать, что происходит с вашим кодом? –

+0

У меня была проблема, я понятия не имел, как исправить это, не используя указатель prev, но я также хотел исправить проблему с тем же кодом, над которым я работал! Я знал, что если предметы, которые нужно удалить, смежны, мой код не будет работать –

ответ

5

Внутри вашей внутренней, а петли, изменения:

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

-

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

Ваша версия пропускает вторую из каждой последовательной пары значений для удаления. Что вы делаете:

5-> 6-> 6-> нулевой

-tmp: 5 -> удалить первую 6, а затем установите TMP на второй 6

-tmp: 6, TMP. следующие: нулевой -> законченные (один 6 останков)

+0

Я впечатлен! Благодаря! :) –

Смежные вопросы