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