代码之家  ›  专栏  ›  技术社区  ›  Stradigos

修改我的单链表

  •  1
  • Stradigos  · 技术社区  · 14 年前

    谢谢你花时间回答我的问题。

    下面您将找到我正在工作的SLL,但是我希望更多地使用C,并且,我希望使用节点的构造函数来完成所有的工作,而不是使用SLL和NODE这两个类(如果您通过节点传递一个字符串,则构造函数将其拆分为char节点)。问题是,经过几个小时的修修补补,我真的什么地方也得不到…

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    
    namespace PalindromeTester
    {
        class Program
        {
            static void Main(string[] args)
            {
                SLL mySLL = new SLL();
                mySLL.add('a');
                mySLL.add('b');
                mySLL.add('c');
                mySLL.add('d');
                mySLL.add('e');
                mySLL.add('f');
    
                Console.Out.WriteLine("Node count = " + mySLL.count);
                mySLL.reverse();
                mySLL.traverse();
                Console.Out.WriteLine("\n The header is: " + mySLL.gethead);
                Console.In.ReadLine();
            }
    
            class Node
            {
                private char letter;
                private Node next;
    
                public Node()
                {
                    next = null;
                }
    
                public Node(char c)
                {
                    this.data = c;
                }
    
                public Node(string s)
                {
    
                }
    
                public char data
                {
                    get { return letter; }
                    set { letter = value; }
                }
    
                public Node nextNode
                {
                    get { return next; }
                    set { next = value; }
                }
            }
    
            class SLL
            {
                private Node head;
                private int totalNode;
    
                public SLL()
                {
                    head = null;
                    totalNode = 0;
                }
    
                public void add(char s)
                {
                    if (head == null)
                    {
                        head = new Node();
                        head.data = s;
    
                    }
                    else
                    {
                        Node temp;
                        temp = new Node();
                        temp.data = s;
                        temp.nextNode = head;
                        head = temp;
                    }
                    totalNode++;
                }
    
                public int count
                {
                    get { return totalNode; }
                }
    
                public char gethead
                {
                    get { return head.data; }
                }
    
                public void traverse()
                {
                    Node temp = head;
                    while(temp != null)
                    {
                        Console.Write(temp.data + " ");
                        temp = temp.nextNode;
                    }
                }
    
                public void reverse()
                {
                    Node q = null;
                    Node p = this.head;
                    while(p!=null)
                    {
                        Node r=p;
                        p=p.nextNode;
                        r.nextNode=q;
                        q=r;
                    }
                    this.head = q;
                }
            }
        }
    }
    

    下面是迄今为止我在尝试将其应用到节点的构造函数中所做的工作:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    
    namespace PalindromeTester
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                Node myNode = new Node("hello");
    
                Console.Out.WriteLine(myNode.count);
                myNode.reverse();
                myNode.traverse();
                Console.In.ReadLine();
            }
    
            class Node
            {
                private char letter;
                private Node next;
                private Node head;
                private int totalNode;
    
                public Node()
                {
                    head = null;
                    totalNode = 0;
                }
    
                public Node(char c)
                {
                    if (head == null)
                    {
                        head = new Node();
                        head.data = c;
    
                    }
                    else
                    {
                        Node temp;
                        temp = new Node();
                        temp.data = c;
                        temp.nextNode = head;
                        head = temp;
                    }
                    totalNode++;
                }
    
                public Node(string s)
                {
                    foreach (char x in s)
                    {
                        new Node(x);
                    }
                }
    
                public char data
                {
                    get { return letter; }
                    set { letter = value; }
                }
    
                public Node nextNode
                {
                    get { return next; }
                    set { next = value; }
                }
    
                public void reverse()
                {
                    Node q = null;
                    Node p = this.head;
                    while (p != null)
                    {
                        Node r = p;
                        p = p.nextNode;
                        r.nextNode = q;
                        q = r;
                    }
                    this.head = q;
                }
    
                public void traverse()
                {
                    Node temp = head;
                    while (temp != null)
                    {
                        Console.Write(temp.data + " ");
                        temp = temp.nextNode;
                    }
                }
    
                public int count
                {
                    get { return totalNode; }
                }
            }
        }
    }
    

    理想情况下,只剩下node()、node(char c)、node(string s)、node reserve()等构造函数和方法,我将把遍历改写为toString重载。

    有什么建议吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Kasper Holdum    14 年前

    如果您希望您的链接列表能够将字符串拆分为多个节点,那么请确保这样做的方法实际上包含在ll中,而不是节点对象中。理论上,除非您在寻找下一个/上一个值,否则您永远不应该知道节点对象。

    您的char链接列表应该有两种方法:一种是添加char,另一种是添加将被切碎为多个节点的字符串。节点对象本身应该只有一个接受char的构造函数。

    基本上,试图将数据结构重写为只包含一个类是一个非常糟糕的想法。你确实需要至少两个物体。一个跟踪节点,一个跟踪节点对象。

        2
  •  0
  •   Daniel Earwicker    14 年前

    假设这只是一个学习练习(没有其他理由写这样的课),那么 totalNode 现场看起来很可疑。它将具有值0或1。假设它是从给定节点开始的节点数的计数吗?如果你把名单倒过来怎么样?

    以及在 Node , the head 字段将始终为 null 所以 if 是多余的。

    也许你应该试着运行代码,然后更新你的问题!