【问题标题】:How do I reverse through a linked list如何通过链表反转
【发布时间】:2013-10-30 20:58:52
【问题描述】:

我需要能够通过此链接列表返回,但是无论我尝试什么,它都不起作用。你能指出我正确的方向吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Student
{ 
    class Program
    {
        public class student_data
        {  
            public string forename;
            public string surname;
            public int id_number;   
            public float averageGrade;  
            public string programme_title;    
            public string programme_code;  
            public student_data nextItem;
            //Declaring public title and public code as a string   
        }

        // Notice that a reference to the struct is being passed in  
        static void populatestudent(out student_data student, string

        fname, string surname, int id_number, string ptitle, string pcode)
        {
            student = new student_data();
            student.forename = fname;   
            student.surname = surname;
            student.id_number = id_number;  
            student.averageGrade = 0.0F;   
            student.programme_title = ptitle;   
            student.programme_code = pcode;
            //populating structre code by adding p code and p title  
        }

        static void Main(string[] args)
        {
            student_data student0, student1, student2, student3;

            populatestudent(out student0, "Mark", "Anderson", 0, "Progrmming Language", "M9604");//student 0 info
            populatestudent(out student1, "Jon", "Smith", 1, "Progrmming Language", "M9604");//student 1 info
            populatestudent(out student2, "Tom", "Jones", 2, "Progrmming Language", "M9604");//student 3 info
            populatestudent(out student3, "Ewan", "Evans", 3, "Progrmming Language", "M9604");//student 4 info

            student_data head = student0;
            student_data tail = student3;

            head.nextItem = student0;
            student0.nextItem = student1;
            student1.nextItem = student2;
            student2.nextItem = student3;

            student_data current = head;
            while (current != null)
            {
                Console.WriteLine("Name: " + current.forename + " " + current.surname);  
                Console.WriteLine("Id: " + current.id_number);  
                Console.WriteLine("Av grade: " + current.averageGrade);   
                Console.WriteLine("Prog title: " + current.programme_title);//find and display students programme title   
                Console.WriteLine("Prog code: " + current.programme_code);
                current = current.nextItem; 
            }
            Console.ReadKey();  
        }   
    }
}

【问题讨论】:

  • 如果你添加 .prevItem(),它应该会让你的生活更轻松

标签: c# linked-list


【解决方案1】:

您的链接列表只有singly linked - 每个项目都包含对下一个项目的引用,但不包含对上一个项目的引用。您不能在这样的列表中倒退。 (如果没有有效地构建包含所有项目的另一个集合。)您需要创建一个doubly linked list。然后很容易。按照链接(没有双关语)了解有关单链表和双链表的更多信息。

我还强烈敦促您开始遵循 .NET 命名约定,并使用属性而不是公共字段。

【讨论】:

    【解决方案2】:

    您可以使用递归向后迭代它。例如:

    private void recurse(student_data current)
    {
        if(current.nextItem != null)
            recurse(current.nextItem);
        //Do your iteration logic here
        Console.WriteLine("Name: " + current.forename + " " + current.surname);  
        Console.WriteLine("Id: " + current.id_number);  
        Console.WriteLine("Av grade: " + current.averageGrade);   
        Console.WriteLine("Prog title: " + current.programme_title);//find and display students programme title   
        Console.WriteLine("Prog code: " + current.programme_code);
    }
    

    然后你所要做的就是将列表的头部传递给递归方法。

    【讨论】:

    • 是的,这会起作用,尽管将列表中的所有项目推送到Stack<T> 而不是利用调用堆栈到同一端可能会更好。
    猜你喜欢
    • 1970-01-01
    • 2015-12-30
    • 2012-02-23
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    相关资源
    最近更新 更多