2024年3月28日·2 min read

数据结构(一)链表

链表基础与删除节点问题的 C# 实现。

链表是一种数据结构,一般来说是这么定义的:

public class LinkedList(int value)
{
    public LinkedList? Next { get; set; }
    public int Value { get; set; } = value;
}

这种是单链表,还可以搞成双链表:

public class LinkedList(int value)
{
    public LinkedList? Next { get; set; }
    public LinkedList? Pre { get; set; }
    public int Value { get; set; } = value;
}

这种数据结构写起来蛮简单。先来点题:

删除链表

题意:删除链表中等于给定值 val 的所有节点。 示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5] 示例 2: 输入:head = [], val = 1 输出:[] 示例 3: 输入:head = [7,7,7,7], val = 7 输出:[] 这里的话我们使用单链表。当value等于相应数的时候,把这个的实例忽略就行,也就是:a.Next = a.Next.Next 但是这里有个问题,就是我们无法判断a是不是这种的。而且因为C#引用类型的原因,我们要想输出头就只能使用最开始给的那个。所有我们首先得先变一下头,把head做个判断。 因此代码就长这样的了:

    public static void Remove(LinkedList? head, int val)
    {
        while (head != null && head.Value == val)
        {
            head = head.Next;
        }
 
        var a = head;
 
        while (a != null)
        {
            if (a.Next?.Value == val)
            {
                a.Next = a.Next.Next;
            }
 
            a = a.Next;
        }
 
        Console.WriteLine(head);
    }