[LeetCode] 707. 设计链表
1. 问题描述
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 题解思路
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. 补充知识と杂谈,总结
链表的基础练习

浙公网安备 33010602011771号