【发布时间】:2018-10-24 11:46:58
【问题描述】:
我从头开始创建了一个简单的列表类。这是一个我已经做了大约一周的课堂作业——对列表来说非常新。我们不能使用泛型,所以试图研究我下面的问题并没有取得成果。虽然我确实在 youtube 上观看了 BetterCoder 的 7 个教程,并且在我的书中找到了一些东西,但没有任何“合并”示例。
我有三个类 - 我的节点、我的列表和我的程序。在我的列表类中,我正在构建一个 Merge() 方法,该方法最终将比较两个列表中的数据并将它们合并到一个有序列表中。
现在,由于某种原因,我的 Merge 方法 - 这是帮助我了解正在发生的事情的非常基本的方法 - 无法正常工作。它有两个列表都传递给它,并且正在将 listTwo 中的数据添加到 listOne 但由于某种原因,当它打印到控制台时,第二个节点的数据显示了两次:
EX: 1 -> 2 -> 2
而不是打印头 (1),下一个 (2),然后是下一个 (3),它应该是。
EX: 1 -> 2 -> 3
在程序类中,我已经用 (listOne.firstNode.Next.Next.Data) = 3 的写行证明了这一点。它应该是。
谁能帮我弄清楚列表一中的节点是否没有正确指向彼此或发生了什么?
-
我的合并方法必须同时传递两个列表对象(listOne 和 listTwo),最终我需要将它们作为引用传递,但我还没有完全弄清楚这一点,我想稍后会专注于这一点。
namespace LinkedList { //This is my Node Class class Node { public object Data { get; set; } public Node Next { get; set; } public Node(object dataValue) : this(dataValue, null) { } public Node(object dataValue, Node nextNode) { Data = dataValue; Next = nextNode; } } //This is my List Class class List { public Node firstNode; public int count; public List() { firstNode = null; } public bool Empty { get { return this.count == 0; } } public int Count { get { return this.count; } } public object Add(int index, object o) { if (index < 0) throw new ArgumentOutOfRangeException("Index: " + index); if (index > count) index = count; Node current = this.firstNode; if (this.Empty || index == 0) { this.firstNode = new Node(o, this.firstNode); } else { for (int i = 0; i < index - 1; i++) current = current.Next; current.Next = new Node(o, current.Next); } count++; return o; } public object Add(object o) { return this.Add(count, o); } public object Merge(List a, List b) { a.Add(b.firstNode.Data); return a; } public void Print() { while (this.count > 0) { Console.Write(firstNode.Data + "->"); if(firstNode.Next != null) firstNode.Data = firstNode.Next.Data; count--; } } } //And here is my Program class Program { static void Main(string[] args) { List listOne = new List(); List listTwo = new List(); listOne.Add(1); listOne.Add(2); listTwo.Add(3); listTwo.Print(); Console.WriteLine(""); listOne.Merge(listOne, listTwo); Console.WriteLine(""); listOne.Print(); //This line below shows that the data "3" from listTwo is being added to listOne in the list Merge Method //Console.WriteLine(listOne.firstNode.Next.Next.Data); Console.ReadKey(); } } }
【问题讨论】:
-
在你的程序主方法中,将这一行
listOne.Merge(listOne, listTwo);改为listOne = listOne.Merge(listOne, listTwo); -
在Print()方法中,
firstNode.Data = firstNode.Next.Data的作用是什么? -
@Paul Karam 我刚试过这个 - 我收到一个错误:“无法将类型 'object' 隐式转换为 'LinkedList.List' ..你是否缺少演员表?:我不确定我会把任何东西都投给..
-
@Andrew Morton 好吧,我关注了我在 youtube 上找到的视频,我的理解是,当将某些内容插入列表时,它会导致第一个节点停止指向下一个节点,这会使指针再次出现......我完全错了吗?
-
@BrookeCobb 是的,你需要转换它,因为该方法返回一个
object,所以它更有可能是listOne = (List)listOne.Merge(listOne, listTwo);,但无论如何,这似乎不是你的问题。这是一个快速浏览的问题。
标签: c# merge singly-linked-list