【问题标题】:Linked list first and last element can't be deleted无法删除链表第一个和最后一个元素
【发布时间】:2019-03-28 20:31:05
【问题描述】:

我在这个论坛上进行了大量研究,发现了许多“解决方案”,但没有一个有效。 也许我的情况有点不同,我也许有人可以看到问题出在哪里。我需要删除每个“值”小于给定(kruvis)的节点元素。

public void Delete()
{
    if (Start == null) return;

    if (Start.Next == null)
    {
        Start = null;
        return;
    }
    if (Current.Next == null)
    {
        Current = null;
    }

    Node temp = Start;
    while (temp.Next.Next != null)
    {
        if (temp.Next == Current)
        {
            temp.Next = Current.Next;
            Current = temp;
            return;
        }
        temp = temp.Next;
    }
}

在不同的类中还有另一个函数(函数中的循环)

for (MenesioAgentai.Pradzia(); MenesioAgentai.ArYra(); MenesioAgentai.Sekantis())
{
    if (MenesioAgentai.GautiT().Kruvis <= kruvis)
    {
        kruvioSuma += MenesioAgentai.GautiT().Kruvis;
        PasalintiAgentoPrenumeratorius(pren, MenesioAgentai.GautiT());
        MenesioAgentai.Delete();
    }
}

问题是第一个和最后一个元素没有被删除 在 NodeList 类中,我有 3 个节点 Start、End、Current。 (以及带有 T 数据和 Node Next 的密封类 Node)

【问题讨论】:

  • 删除链表中的第一个(开始)元素有什么难的,a-la Start = Start.Next ?要删除最后一个元素,您必须遍历列表以找到倒数第二个元素,然后执行 End = SecondLast.Next ... (哦,您还必须考虑列表只有一个元素的情况开始,结束,当前都是同一个元素)
  • 我试过 if(Current==Start){ start=start.next return;} 但它不起作用..
  • 我正在测试我的程序,当我将 value(kruvis) 设为最大数时(每次首先删除所有元素)它不起作用,它会跳过第一个元素,然后删除所有元素,直到最后一个元素
  • 好吧,如果你只做if(Current==Start){ Start=Start.next return;},那么这段代码执行后Current指的是什么?
  • 如果你在理解你对链表做什么(或应该做什么)有困难,我建议你拿笔和纸,在纸上“手动”练习列表操作,详细步骤-循序渐进的方式(包括所有涉及的“各方”,如开始、当前、结束等)。这既可以帮助您制定列表操作应该精确执行的“心理过程”,又可以为您提供在纸上以图形方式可视化过程的机会。

标签: c# algorithm linked-list


【解决方案1】:

当头节点也需要删除时,从链表中删除节点有点棘手。更简单的方法是在开头添加一个哨兵节点。以下 Java 代码说明了如何删除值小于给定值的节点。为简单起见,我使用了 int 类型的值。

/*
// Node definition
class Node {
   Node next;
   int val;

   Node(int val) {
       this.val = val;
   }
}
*/

public Node delete(Node head, int k) {
    Node sentinel = new Node(Integer.MIN_VALUE);
    sentinel.next = head;

    Node prev = sentinel, curr = sentinel.next;
    while(curr != null) {
        while(curr != null && curr.val < k) {
            curr = curr.next;
        }
        prev.next = curr;
        prev = curr;
        if(curr != null) {
            curr = curr.next;
        }
    }
    return sentinel.next;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2011-06-06
    • 1970-01-01
    相关资源
    最近更新 更多