java - 删除链表中等于给定值的所有值

标签 java algorithm data-structures linked-list singly-linked-list

你能解释一下为什么我的代码并不总是删除链表中等于方法参数中给定值的所有值吗?我该如何解决?它通过了 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;
    }
}

它没有通过这个测试用例:

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

最佳答案

在你的内部 while 循环中,改变:

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.next: null -> 完成(剩下一个 6)

关于java - 删除链表中等于给定值的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36241639/

相关文章:

javascript - 从 Nashorn 到 Graaljs

algorithm - 两人硬币游戏的最佳策略

c++ - 如何使用 Judy 阵列

java - 如何延迟页面或 sleep 线程直到下载过程或进度条完成

Java:找不到适合 Scanner(int) 的构造函数

javascript - 国际象棋 AI 需要一个非递归的、基于迭代的 negamax 算法

algorithm - 在 O(n) 时间内找到重叠约会?

c# - 什么 C# 数据结构支持以下内容?

haskell - 在 Haskell 中表达逻辑一致性

java - 防止 BoxLayout 扩展子项