一、题目描述
输入一个链表,反转链表后,输出新链表的表头。
输入
{1,2,3}
返回值
{3,2,1}
二、思路
我们定义三个指针:
1、新链表指针pre--用来存放逆转后的链表
2、当前元素指针cur
3、保存元素指针nex
4、新链表临时头结点head
首先,让保存结点指向第二个元素,以保存后面的子链表;
然后,让第一个结点断链,指向新链表;
再让pre等于第一个结点;
最后让当前结点等于子链表首结点。
然后不断进行循环,直到当前结点指向空。
当逆转完意义链后,增加头结点即可。
图解:
核心逻辑:
//循环结束条件:当前结点不为空
while (cur != NULL)
{
//因为当前结点会发生改动,所以让保存结点保存当前结点的后面所有链表
nex = cur->next;
//断链,让当前结点指向新链表的首结点
cur->next = pre;
//让pre重新指向新链表的有意义的头
pre = cur;
//此时当前指针指向新链表,继续让当前指向原链表的头,下一步再让保存结点继续保存后面的链表
cur = nex;
}
//让头结点指向新链表
head->next = pre;
pre = head;
三、代码
LinkedList Reverse(LinkedList& L)
{
LinkedList pre;//逆转后新链表
Node* cur;//当前结点
Node* nex;//当前结点的下一个结点
Node* head;//临时头结点
//为新链表头结点分配内存
head = (Node*)malloc(sizeof(Node));
//初始化新链表,让首结点为一个空结点
pre = NULL;
//让当前结点跳过头结点,指向有意义的第一个结点
cur = L->next;
//循环结束条件:当前结点不为空
while (cur != NULL)
{
//因为当前结点会发生改动,所以让保存结点保存当前结点的后面所有链表
nex = cur->next;
//断链,让当前结点指向新链表的首结点
cur->next = pre;
//让pre重新指向新链表的有意义的头
pre = cur;
//此时当前指针指向新链表,继续让当前指向原链表的头,下一步再让保存结点继续保存后面的链表
cur = nex;
}
//让头结点指向新链表
head->next = pre;
pre = head;
return pre;
}