问题描述
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
思路
假设现有链表1–>2–>3–>4–>5–>6
我们需要令后一个节点指向前一个节点,例如让2指向1,将会导致无法在链表中遍历到节点3,为了避免链表中节点2断开,需要在调整节点之前,把节点3保存下来。所以,在调整节点时,我们不止要知道当前的节点,还要保存当前节点的上一个节点和下一个节点。最后,不难分析得出反转后链表的头节点就是原始链表的尾节点,所以当我们调整节点到尾节点的时候,令反转链表的头指针指向尾节点即可。
代码测试如下:
using System;
namespace 反转链表
{
class ListNode
{
public int val;
public ListNode next;
public ListNode(int val) { this.val = val; }
}
class Program
{
static void Main(string[] args)
{
//Test1:链表有多个节点
Console.WriteLine("Test1:");
ListNode list1 = CreateList(null);
PrintList(list1);
list1 = ReverseList(list1);
PrintList(list1);
//Test2:链表有且仅有一个结点
Console.WriteLine("Test2:");
ListNode list2 = new ListNode(1);
PrintList(list2);
list2 = ReverseList(list2);
PrintList(list2);
//Test3:链表为空
Console.WriteLine("Test3:");
ListNode list3 = null;
PrintList(list3);
list3 = ReverseList(list3);
PrintList(list3);
}
/// <summary>
/// 反转链表
/// </summary>
/// <param name="pHead">链表的头节点</param>
/// <returns>反转后链表的头节点</returns>
public static ListNode ReverseList(ListNode pHead)
{
if (pHead == null)
return null;
//preNode用来储存当前节点的上一个节点
//nowNode用来储存当前节点
//reverseHeadNode用来储存反转链表的头节点
ListNode preNode = null, nowNode=pHead, reverseHeadNode = null;
while (nowNode != null)
{
ListNode nextNode = nowNode.next;
//如果已经反转到了最后一个节点,那么令反转头指针指向反转链表的头节点
if (nextNode == null)
reverseHeadNode = nowNode;
//当前节点的next指针指向上一个节点
nowNode.next = preNode;
//更新节点
preNode = nowNode;
nowNode = nextNode;
}
return reverseHeadNode;
}
/// <summary>
/// 新建链表
/// </summary>
/// <param name="pHead">链表头节点</param>
/// <returns>链表头节点</returns>
private static ListNode CreateList(ListNode pHead)
{
ListNode list = new ListNode(1) { next = null };
if (pHead == null)
pHead = list;
for(int i = 2; i <= 10; i++)
{
ListNode temp = new ListNode(i);
list.next = temp;
list = temp;
}
return pHead;
}
/// <summary>
/// 打印链表
/// </summary>
/// <param name="pHead">链表头节点</param>
private static void PrintList(ListNode pHead)
{
if(pHead==null)
{
Console.WriteLine("null");
return;
}
ListNode list = pHead;
while (list != null)
{
Console.Write(list.val + "-->");
list = list.next;
}
Console.WriteLine();
}
}
}