反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
一个迭代循环:
/// <summary>
/// 遍历时直接将指针反转,这样比较高效,需处理好前后指针关系
/// </summary>
/// <param name="head"></param>
/// <returns></returns>
public static ListNode Method1(ListNode head)
{
ListNode currNode = head;
ListNode preNode = null;
while (currNode != null)
{
ListNode tmpNode = currNode.next;//获取头结点后面的所有节点
currNode.next = preNode;//头结点的next指向新的链表
preNode = currNode;//赋值给新的链表
currNode = tmpNode;//赋值给当前链表
}
return preNode;
}
一个递归调用:
/// <summary>
/// 使用递归遍历链表至倒数第二位元素,接着依次将next指针反转
/// </summary>
/// <param name="head"></param>
/// <returns></returns>
public static ListNode Method2(ListNode head)
{
if (head == null || head.next == null) return head;
ListNode currNode = Method2(head.next);
head.next.next = head;
head.next = null;
return currNode;
}