[LeetCode] 707. 设计链表

1. 问题描述

707. 设计链表 - 力扣(LeetCode)


2. 实现思路

2.1 自己的思路

~~(一定要写出来啊喂)~

其实很基础的一道题个人感觉,虽然是mid难度,但花的时间太长了,故而放弃看题解了

// @lc code=start
public class MyLinkedList
{
    private class Node(int val = 0, Node? pre = null, Node? next = null)
    {
        public int Val { get; set; } = val;
        public Node? Pre { get; set; } = pre;
        public Node? Next { get; set; } = next;
    }

    private int _size;
    private Node _dummyNode;

    public MyLinkedList()
    {
        _dummyNode = new Node();
        _size = 0;
    }

    public int Get(int index)
    {
        return GetNode(index)?.Val ?? -1;
    }

    public void AddAtHead(int val)
    {
        if (_size == 0)
            _dummyNode.Next = new Node(val, _dummyNode);
        else
        {
            var oldHead = _dummyNode.Next;
            var newHead = new Node(val, _dummyNode, oldHead);
            oldHead.Pre = newHead;
            _dummyNode.Next = newHead;
        }
        _size++;
    }

    public void AddAtTail(int val)
    {
        if (_size == 0)
            _dummyNode.Next = new Node(val, _dummyNode);
        else
        {
            var tail = GetNode(_size - 1);
            var newTail = new Node(val, tail);
            tail.Next = newTail;
        }
        _size++;
    }

    public void AddAtIndex(int index, int val)
    {
        if (index < 0 || index > _size) return;
        if (index == 0) AddAtHead(val);
        else if (index == _size) AddAtTail(val);
        else
        {
            var preNode = GetNode(index - 1);
            var nextNode = GetNode(index);
            var newNode = new Node(val, preNode, nextNode);
            preNode?.Next = newNode;
            nextNode?.Pre = newNode;
        }
        _size++;
    }

    public void DeleteAtIndex(int index)
    {
        if (index >= _size) return;
        var dirtyNode = GetNode(index);
        var preNode = dirtyNode.Pre;
        var nextNode = dirtyNode.Next;
        preNode?.Next = nextNode;
        nextNode?.Pre = preNode;
        dirtyNode?.Next = null;
        dirtyNode?.Pre = null;
        _size--;
    }

    private Node? GetNode(int index)
    {
        if (index >= _size || index < 0) return null;

        Node? temp = _dummyNode.Next;
        for (int i = 0; i < index; i++)
        {
            if (temp?.Next != null)
                temp = temp.Next;
        }

        return temp;
    }
}

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList obj = new MyLinkedList();
 * int param_1 = obj.Get(index);
 * obj.AddAtHead(val);
 * obj.AddAtTail(val);
 * obj.AddAtIndex(index,val);
 * obj.DeleteAtIndex(index);
 */
// @lc code=end

总感觉思路有点混乱

2.2 题解思路

707.设计链表 | 虚拟头节点 | 双链表

class ListNode
{
    public int val;
    public ListNode next;
    public ListNode(int val) { this.val = val; }
}
public class MyLinkedList
{
    ListNode dummyHead;
    int count;

    public MyLinkedList()
    {
        dummyHead = new ListNode(0);
        count = 0;
    }

    public int Get(int index)
    {
        if (index < 0 || count <= index) return -1;
        ListNode current = dummyHead;
        for (int i = 0; i <= index; i++)
        {
            current = current.next;
        }
        return current.val;
    }

    public void AddAtHead(int val)
    {
        AddAtIndex(0, val);
    }

    public void AddAtTail(int val)
    {
        AddAtIndex(count, val);
    }

    public void AddAtIndex(int index, int val)
    {
        if (index > count) return;
        index = Math.Max(0, index);
        count++;
        ListNode tmp1 = dummyHead;
        for (int i = 0; i < index; i++)
        {
            tmp1 = tmp1.next;
        }
        ListNode tmp2 = new ListNode(val);
        tmp2.next = tmp1.next;
        tmp1.next = tmp2;
    }

    public void DeleteAtIndex(int index)
    {

        if (index >= count || index < 0) return;
        var tmp1 = dummyHead;
        for (int i = 0; i < index; i++)
        {
            tmp1 = tmp1.next;
        }
        tmp1.next = tmp1.next.next;
        count--;

    }
}

2.3 优化(或者敲一遍题解?)

嘶看题解也是讲很基础的题,那放弃双向链表,用单链表再来搓试试吧

我的天啊终于www,一遍test过,然后一遍submit过,终于

不过对比了一下题解,可以简化的部分是,AddAtHead和AddAtTail其实就是AddAtIndex然后对应0和count-1的位置

/*
 * @lc app=leetcode.cn id=707 lang=csharp
 *
 * [707] 设计链表
 */

// @lc code=start
public class MyLinkedList
{
    private class Node
    {
        public int Val { get; set; }
        public Node Next { get; set; }

        public Node(int val = 0, Node next = null)
        {
            Val = val;
            Next = next;
        }
    }

    private Node _dummyNode;
    private int _size;

    public MyLinkedList()
    {
        _dummyNode = new Node();
        _size = 0;
    }

    public int Get(int index)
    {
        if (index < 0 || index >= _size) return -1;
        Node temp = _dummyNode;
        for (int i = 0; i <= index; i++)
            temp = temp.Next;
        return temp.Val;
    }

    public void AddAtHead(int val)
    {
        var newHead = new Node(val, _dummyNode.Next);
        _dummyNode.Next = newHead;
        _size++;
    }

    public void AddAtTail(int val)
    {
        Node tail = _dummyNode;
        for (int i = 0; i < _size; i++)
            tail = tail.Next;
        Node newTail = new Node(val);
        tail.Next = newTail;
        _size++;
    }

    public void AddAtIndex(int index, int val)
    {
        if (index < 0 || index > _size) return;
        Node target = _dummyNode;
        Node pre = _dummyNode;
        for (int i = 0; i <= index; i++)
        {
            target = target.Next;
            if (i != index)
                pre = pre.Next;
        }
        Node newNode = new Node(val, target);
        pre.Next = newNode;
        _size++;
    }

    public void DeleteAtIndex(int index)
    {
        if (index < 0 || index >= _size) return;
        Node pre = _dummyNode;
        for (int i = 0; i <= index - 1; i++)
            pre = pre.Next;

        pre.Next = pre.Next?.Next;

        _size--;
    }
}

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList obj = new MyLinkedList();
 * int param_1 = obj.Get(index);
 * obj.AddAtHead(val);
 * obj.AddAtTail(val);
 * obj.AddAtIndex(index,val);
 * obj.DeleteAtIndex(index);
 */
// @lc code=end


3. 补充知识と杂谈,总结

链表的基础练习

posted @ 2026-08-10 12:55  绘星tsuki  阅读(7)  评论(0)    收藏  举报