链表反转实现方式
例如有链表 1 -> 2 -> 3 -> 4 -> 5
反转后变为 5 -> 4 -> 3 -> 2 -> 1
反转方式就是将所有的箭头反转,也就是链表中所有的Next节点指向它前一个节点。
LinkNode类
public class LinkNode<T>
{
public T Data { get; set; }
public LinkNode<T> Next { get; set; }
public LinkNode(T data)
{
Data = data;
Next = null;
}
public LinkNode()
{
Next = null;
}
}
LinkList类
public class LinkList<T>
{
public LinkNode<T> Head;
public LinkList()
{
Head = new LinkNode<T>();
}
public void AddLinkNode(T valueToAdd)
{
var newNode = new LinkNode<T>(valueToAdd);
LinkNode<T> tmp = Head;
while (tmp.Next != null)
{
tmp = tmp.Next;
}
tmp.Next = newNode;
}
public void PrintAllNodes()
{
LinkNode<T> tmp = Head;
while (tmp != null)
{
Console.WriteLine(tmp.Data);
tmp = tmp.Next;
}
}
public LinkNode<T> Reverse(LinkNode<T> node1, LinkNode<T> node2)
{
bool isHead = false;
if (node1 == Head)
isHead = true;
LinkNode<T> tmp = node2.Next;
node2.Next = node1; //使Node2节点指向Node1节点
if (isHead) //头节点反转后就是尾节点,它的Next为空
node1.Next = null;
if (tmp == null)
return node2;
else
return Reverse(node2, tmp);
}
}
主函数
static void Main(string[] args)
{
var linklist = new LinkList<string>();
Console.WriteLine("______原始链表打印________");
linklist.Head.Data = "HEAD";
linklist.AddLinkNode("test1");
linklist.AddLinkNode("test2");
linklist.AddLinkNode("test3");
linklist.AddLinkNode("test4");
linklist.PrintAllNodes();
Console.WriteLine("______链表反转递归实现________");
linklist.Head = linklist.Reverse(linklist.Head, linklist.Head.Next);
linklist.PrintAllNodes();
}