- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图修复一个代码,它是一个 LinkedList。任务是删除列表的最后 X 个元素。我用 RemoveRange 尝试过,但 VS 不接受我的解决方案并说 RemoveRange 不存在。
var list = new DoublyLinkedList<string>();
list.Add("A");
list.Add("B");
list.Add("C");
list.Add("D");
list.Add("E");
list.RemoveLast(2);
这是程序(主要)中的代码。在第二个类中应该有 RemoveLast 方法,但我没有得到有效代码。谁能给我解释一下,我是如何获得 RemoveLast 的?
using System;
using System.Collections;
using System.Collections.Generic;
namespace Test
{
public class DoublyLinkedList<T> : IEnumerable<T>
{
public void RemoveLast(int v)
{
int remove = Math.Max(0, this.Count - v);
this.RemoveRange(v, this.Count - v);
}
}
}
RemoveRange 是红色下划线
感谢您的帮助!
完整的双链表:
`using System;
using System.Collections;
using System.Collections.Generic;
namespace Test
{
public class DoublyLinkedList<T> : IEnumerable<T>
{
public void RemoveLast(int v)
{
int remove = Math.Max(0, this.Count - v);
this.RemoveRange(v, this.Count - v);
}
private sealed class Node
{
public T Item { get; set; }
public Node Previous { get; set; }
public Node Next { get; set; }
}
private Node first, last;
public int Count { get; private set; }
public void Add(T item)
{
Node newItem = new Node() { Item = item, Next = null, Previous = null };
if (first == null)
{
first = newItem;
last = newItem;
}
else
{
last.Next = newItem;
newItem.Previous = last;
last = newItem;
}
Count++;
}
IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
Node node = first;
while (node != null)
{
yield return node.Item;
node = node.Next;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<T>)this).GetEnumerator();
}
public override string ToString()
{
string s = "";
Node node = first;
while (node != null)
{
s += node.Item.ToString() + " -> ";
node = node.Next;
}
s += "Count: " + Count.ToString();
return s;
}
private Node find(T item)
{
Node node = first;
while (node != null)
{
if (node.Item.Equals(item))
return node;
node = node.Next;
}
return null;
}
private Node findPrevious(T item)
{
Node previousNode = null;
Node node = first;
while (node != null)
{
if (node.Item.Equals(item))
return previousNode;
previousNode = node;
node = node.Next;
}
return null;
}
}
}`
最佳答案
您知道已经有一个双链表类,不是吗? System.Collections.Generic.LinkedList ?我的建议是使用该类(class)。
如果重新设计代码的工作量太大,例如因为您的 DoublyLinkedList 已经被大量使用,我的建议是让 DoublyLinkedList 成为 LinkedList 的适配器:
class DoublyLinkedList<T> : IEnumerable<T>, IEnumerable
{
private readonly LinkedList<T> linkedList = new LinkedList<T>();
public int Count => this.linkedList.Count;
public void Add(T item)
{
this.LinkedList.Add(item);
}
public IEnumerator<T> GetEnumerator()
{
return this.LinkedList.GetEnumerator();
}
... // etc.
}
您需要添加一个方法来从列表中删除最后 N 项。例如RemoveLast(10) 应该从双向链表中删除最后 10 个元素。如果您的列表包含 10 个或更少的元素,这将清除您的完整列表。
void Clear()
{
this.LinkedList.Clear();
}
void RemoveLast()
{
if (this.LinkedList.Count != 0)
this.linkedList.RemoveLast();
}
void RemoveLast(int removeCount)
{
if (this.Count <= removeCount)
{
this.linkedList.Clear();
}
else
{
for (int i=0; i<removeCount; ++i)
{
this.RemoveLast();
}
}
}
这可能是因为您的主管很固执,没有听从您的建议来重用经过全面测试的值得信赖的 .NET 类。在这种情况下,您必须更改 RemoveLast()
方法。
void Clear()
{
this.first = null;
this.last = null;
this.count = 0;
}
void RemoveLast()
{
switch (this.Count)
{
case 0:
// empty list; do nothing
break;
case 1:
// removing the last element of the list
this.Clear();
break;
default:
var lastNode = this.last;
// because more than one element I'm certain there is a previous node
var previousNode = lastNode.Previous;
var previousNode.Next = null;
this.last = previousNode;
--this.count;
break;
}
}
关于c# - DoublyLinkedList C# 移除最后两个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62299315/
嘿,我有一个 DoublyLinkedList,任何时候我都尝试调用头文件中的方法。我调用统计列表。因为我已经声明了 DoublyLinkedList,正如您在我的代码中看到的那样: DoublyLi
我正在尝试添加一个 Stats 对象,该对象将是具有名字、姓氏、级别和经验的玩家。我在 Stats.h 中进行了设置。但我的问题主要是我不知道如何将统计播放器添加到列表中。这是我正在尝试做的事情: S
我正在制作一个双向链表。错误与我的 Remove 方法有关。我想不通。有谁知道吗? 这里是哪里出错了? Error 1 error C2027: use of undefined type 'Doub
我试图修复一个代码,它是一个 LinkedList。任务是删除列表的最后 X 个元素。我用 RemoveRange 尝试过,但 VS 不接受我的解决方案并说 RemoveRange 不存在。 var
它只是不起作用 ):这是我的 toString() 方法。 public String toString() { String s= "["; DoublyLinkedList.Lis
我正在尝试删除 C++ 中的重复项目。我已经设法通过使用对象默认构造函数将对象设置为 = null。但我无法将其从列表中完全删除。此代码还删除了两个对象,而不仅仅是一个。这是另一个问题的重新发布。我的
我目前正在尝试创建一个使用尾递归的双向链表。 我的 addItem 已完全正常工作。我的 InsertItem 在指定索引处成功插入和项目。但是它会删除那里的任何项目并且不会移动所有数据。当尝试在索引
我正在尝试了解如何 DoublyLinkedList.java作为普林斯顿版本。请点击超链接以获取详细信息。 但是时间久了,我还有两个问题想完全理解这个实现。 问题 1:remove 方法中的 if-
基本上,当我的列表中只插入一个 Player 对象时,我的打印函数将打印出内容。但是当我插入另一个对象时,它会添加它,但插入的第一个元素已被覆盖。我已经测试了我的插入和附加功能,但我不认为它与这些功能
我最近遇到了一些 PHP-SPL 数据结构,我一直在查看第一个,the doubly linked list .我大概知道什么是链表,现在我可以看到什么是双向链表,但我的问题是:我到底要用它做什么?
我目前正在为我的 DLList 程序编写 deleteAt() 函数,尽管为了尝试删除堆栈中间的一个节点,代码的行为不可预测,我不知道为什么? 对于先前创建的包含数字的列表: 2、3、9、8、7、4
我正在用 C++ 编写一个 DoublyLinkedList,我为这个实现编写的测试之一以一种奇怪的方式失败了。 我创建了一个 StubClass 来填充我的 DoublyLinkedList,它的定
我正在尝试用 Java 实现 Knuth 的 Dancing Links 算法。 根据 Knuth 的说法,如果 x 是一个节点,我可以通过 C 中的以下操作完全取消链接节点: L[R[x]] set
我是一名优秀的程序员,十分优秀!