簡體   English   中英

C#刪除鏈表中的節點

[英]C# deleting nodes in linkedlist

我正在研究帶有鏈表的基數排序算法。 我已經想到了如何解決它,但是我需要能夠刪除整個鏈表(在循環鏈表時逐個刪除節點)。 我遇到的問題是我當前的(節點)指針沒有先獲得值。 我嘗試了很多不同的東西,但我想我不明白如何在刪除節點時重置指針“第一”、“當前”、“左”、“右”

Radixsort.cs:

public static void Counting_sort(LinkedList<int> list, int exp)
    {
        LinkedList<int> D = new LinkedList<int>();
        LinkedList<int>[] lists = new LinkedList<int>[10];
        for (int i = 0; i < lists.Length; i++)
        {
            lists[i] = new LinkedList<int>();
        }

        // Skaiciu daznumas
        int number = 0;
        for (list.Beginning(); list.Exists(); list.Next())
        {
            number = (list.Take() / exp % 10);
            lists[number].Add(list.Take());
            list.Remove(list.TakeNode());        <---------- Removing node one by one till it's empty
        }

        for (int i = 0; i < lists.Length; i++)
        {
            for (list.Beginning(); list.Exists(); list.Next())
            {
                //list.Add(lists)
            }
        }
    }

    public static void Radix_sort(LinkedList<NumberPlate> list)
    {
        LinkedList<int> intList = new LinkedList<int>();
        AddIntToLinkedList(list, intList);
        for (int exp = 1; exp < Math.Pow(10, 9); exp *= 10)
        {
            Counting_sort(intList, exp);
        }
    }

鏈表

public class LinkedList<T> : IEnumerable<T> where T : IComparable<T>, IEquatable<T>
{
    public sealed class Node<T>
    {
        public Node<T> Right;
        public Node<T> Left;

        public T data;

        public Node(T value, Node<T> left, Node<T> right)
        {
            Left = left;
            Right = right;
            data = value;
        }
    }

    private Node<T> first;
    private Node<T> last;
    private Node<T> current;
    public int size;

    public LinkedList()
    {
        first = null;
        last = null;
        current = null;
        size = 0;
    }

    public void Add(T element)
    {
        var node = new Node<T>(element, last, null);

        if (first != null)
        {
            last.Right = node;
            last = node;
        }
        else
        {
            first = node;
            last = node;
        }
        current = node;
        size++;
    }

    public void Remove(Node<T> node)
    {
        if (node == first)
        {
            first = first.Right;

        }
        else if (node == last)
        {
            last = last.Left;
        }
        else if (node.Left != null)
        {
            node.Left.Right = node.Right;
        }
        else if (node.Right != null)
        {
            node.Right.Left = node.Left;
        }
        size--;
    }

    public void Beginning()
    {
        current = first;
    }

    public void End()
    {
        current = last;
    }

    public void Next()
    {
        current = current.Right;
    }

    public void Previous()
    {
        current = current.Left;
    }

    public bool Exists()
    {
        return current != null;
    }

    public T Take()
    {
        return current.data;
    }

    public Node<T> TakeNode()
    {
        return current;
    }

我認為您應該能夠這樣做來清除列表:

foreach (var node in list)
{
    list.Remove(node);
}

在 LinkedList 類中已經為您實現了 Remove 方法,因此您應該使用它。

由於 LinkedList 實現了 IEnumerable,您可以使用 foreach 對其進行迭代。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM