我已经开始学习C#中的算法了。我一直在尝试自己创建一个链表算法(只是为了好玩)。但我有一个问题。我想知道,如何将节点添加到列表中?现在我有三个与节点交互的方法,但列表是空的,所以没有任何反应。
节点类
class Node {
public int info;
public Node link;
public Node (int i)
{
info = i;
link = null;
}
}
SingleLinkedList类
class SingleLinkedList {
private Node start;
public SingleLinkedList ()
{
start = null;
}
public void CreateList() {
//TODO: Create the linked list here
}
public void DisplayList() {
Node p;
if (start == null) {
Console.WriteLine ("Your list is empty, idiot");
return;
}
Console.WriteLine ("List is : ");
p = start;
while (p != null) {
Console.WriteLine (p.info + " ");
p = p.link;
}
Console.WriteLine ();
}
public void CountNodes() {
int n = 0;
Node p = start;
while (p != null) {
n++;
p = p.link;
}
Console.WriteLine ("Number of nodes in list is = " + n);
}
public bool Search (int x) {
int position = 1;
Node p = start;
while (p != null) {
if (p.info == x)
break;
position++;
p = p.link;
}
if (p == null) {
Console.WriteLine (x + "not found in list because use an idiot");
} else {
Console.WriteLine (x + "is at position " + position);
return true;
}
return false;
}
}
主要
int choice, data;
SingleLinkedList list = new SingleLinkedList ();
Console.WriteLine ("1.Display List");
Console.WriteLine ("2.Count Nodes");
Console.WriteLine ("search for an integer");
Console.WriteLine ("Enter your choice master: ");
choice = Convert.ToInt32 (Console.ReadLine ());
switch (choice) {
case 1:
list.DisplayList ();
break;
case 2:
list.CountNodes ();
break;
case 3:
Console.WriteLine ("Enter the element to be searched");
data = Convert.ToInt32 (Console.ReadLine ());
list.Search (data);
break;
default:
break;
}
如何在SingleLinkedList类中实现CreateList方法以将节点添加到列表中?
答案 0 :(得分:4)
单链接列表模式维护指向第一个节点的指针/引用,每个项目包含指向列表中下一个节点的指针/引用。附加到列表意味着找到空引用 - 无论是根引用还是链的末尾 - 并使用对新节点的引用填充它:
public void Append(Node value)
{
// check if we are adding to an empty list
if (start == null)
start = value;
else
{
// find the last valid node
Node curr;
for (curr = start; curr.link != null; curr = curr.link);
// add the item
curr.link = value;
}
}
这样做的缺点是,列表中的项目越多,找到添加下一个项目的结尾所需的时间就越长。换句话说,它是O(N)操作,当您一次添加数千个项目时,真正重要。对于任何多达一百件左右的物品,您可能都不会注意到它,但尝试在该列表中添加100,000件物品。
幸运的是,只需跟踪列表中的最后一项 - 尾部,就可以将列表上的追加操作简化为O(1)。
public class SingleLinkedList
{
Node head;
Node tail;
public void Append(Node value)
{
if (head == null)
head = value;
else
tail.link = value;
tail = value;
}
}
现在,您可以以相同的速度(给予或花费几微秒)将项目添加到百万项目列表中作为列表,其中没有任何内容。您只需记得在从列表中删除项目时更新tail
。
至于搜索等,您可以实现IEnumerable
并使用LINQ完成所有工作。或添加为您执行此操作的Items
属性:
public IEnumerable<int> Items
{
get
{
for (var next = head; next != null; next = next.link)
yield return next.value;
}
}
现在,您可以使用以下内容测试列表中存在的项目:
if (list.Items.Any(i => i == somevalue))
{
}
答案 1 :(得分:0)
public void AddNodeToList(Node nodeToBeAdded)
{
Node temp = null;
if (start == null)
{
start = nodeToBeAdded;
}
else
{
temp = start;
while (temp.link != null)
{
temp = temp.link;
}
temp.link = nodeToBeAdded;
}
nodeToBeAdded.link = null;
}
public void CreateList(Node[] nodesToBeAdded)
{
foreach (Node item in nodesToBeAdded)
{
this.AddNodeToList(item);
}
}