单链表的反序输出

这是是曾经面试题里被问到的一个问题。老实讲当时一脸懵,后来网上查了下,发现还是挺巧妙的。
想明白之后,其实原理也挺简单。就是先找到队尾元素,然后反向输出。就好像你只需要记住你原来后面站的是谁,你现在就站他后面就可以了,不用管别的。

这里用递归的方式实现反序输出。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LinkReverse : MonoBehaviour
{
    
    private void Start()
    {
        MyLinkList<Student> st= new MyLinkList<Student>();
        Student xiaoming = new Student("xiaoming");
        st.Add(xiaoming);
        Student huahua = new Student("huahua");
        st.Add(huahua);
        Student xiaobai = new Student("xiaobai");
        st.Add(xiaobai);
        st.OutPut();
        st.Reverse();
        st.OutPut();
    }
}
public class Student:Node<Student>
{
    string name;
    public Student(string str): base(str)
    {
        name = str;
    }
}
public class Node<T>
{
    public Node<T> Next;
    public string id;
    public Node(string _id)
    {
        id = _id;
    }
}
public class MyLinkList<T>
{
    private Node<T> m_header = null;
    private Node<T> m_tail = null;

    public void Add(Node<T> t)
    {
        if (m_header == null)
        {
            m_header = t;
            m_tail = t;
            m_tail.Next = null;
            return;
        }
        else
        {
            m_tail.Next = t;
            m_tail = t;
        }
    }
    public void OutPut()
    {
        PrintNode(m_header);
    }
    private void PrintNode(Node<T> node)
    {
        if (node != null)
        {
            Debug.Log(node.id);
            PrintNode(node.Next);
        }
        else
        {
            return;
        }
    }
    public void Reverse()
    {
        Reverse(m_header);
    }
    private  Node<T> Reverse(Node<T> header)
       {
           if (header.Next == null)
           {
            m_header = header;
               return header;
           }
           //找到最后一个
           var node = Reverse(header.Next);
           //后一个的指针 指向前一个
           header.Next.Next = header;
           //前一个指针置空
           header.Next = null;
   
           return node;
       }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值