链接列表的第一个和最后一个元素不能删除

时间:2019-03-28 20:31:06

标签: c# algorithm linked-list

我在这个论坛上进行了大量研究,发现了许多“解决方案”,但没有一个起作用。 也许我的情况有些不同,也许有人可以看到问题出在哪里。我需要删除每个“值”小于给定(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)

1 个答案:

答案 0 :(得分:0)

当还需要删除头节点时,从链接列表中删除节点会有些棘手。一种更简单的方法是在开始处添加一个哨兵节点。以下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;
}