数据结构:链表反转
https://wenku.baidu.com/view/51245a5ee2bd960591c6773e.html
方法1:递归:
每个递归都得走完全程,本递归线到最后一个节点,然后再依次从最后一个节点开始走完全程;依次返回到最开始节点。
比如顺序:1-2-3-4;反序后是4-3-2-1,每进行一次递归最后元素.next=null
static void Main(string[] args)
{
Node node1 = new Node() { Data = 1 };
Node node2 = new Node() { Data = 2 };
Node node3 = new Node() { Data = 3 };
Node node4 = new Node() { Data = 4 };
node1.Next = node2;
node2.Next = node3;
node3.Next = node4;
Node node = ReverseNode(node1);
}
public static Node ReverseNode(Node head)
{
if (head.Next == null)
return head;
Node rHead = ReverseNode(head.Next);
head.Next.Next = head;
head.Next = null;
return rHead;
}
public class Node
{
public object Data
{
get;
set;
}
public Node Next
{
get;
set;
}
}
方法二:非递归,采用两个临时变量
static void Main(string[] args)
{
Node node1 = new Node() { Data = 1 };
Node node2 = new Node() { Data = 2 };
Node node3 = new Node() { Data = 3 };
Node node4 = new Node() { Data = 4 };
node1.Next = node2;
node2.Next = node3;
node3.Next = node4;
node4.Next = null;
Node node = ReverseNode(node1);
}
public class Node
{
public object Data
{
get;
set;
}
public Node Next
{
get;
set;
}
}
public static Node ReverseNode(Node head)
{
if (head.Next == null)
{
return head;
}
else if (head.Next.Next == null)
{
head.Next.Next = head;
head.Next = null;
return head;
}
else
{
//0.初始值
Node current = head;
//00.先存起来,后面用
Node next = head.Next;
//01.将头部元素的next初始值设置为空
head.Next = null;
//02.临时变量
Node nextNext = null;
while (next != null)
{
//存起来,后面用
nextNext = next.Next;
//1.核心算法
next.Next = current;
//2.当前节点往后移动一位
current = next;
next = nextNext;
}
head = current;
return head;
}
}