数据结构:链表反转

 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;
}
}

 

posted on 2017-04-28 08:08  zjone391  阅读(101)  评论(0编辑  收藏  举报