一、逆序要求
链表逆序要求改变节点指向,即最后一个节点为第一个数据,依次指向前一个节点。而不是简单的数据交换。链表可分为有头节点和无头节点,本次代码实现建立在有头链表基础上,无头链表也可适用,实际上是一个道理。
二、实现思路
要实现逆序该链表肯定得有两个及以上数据啦,首先,我们将复杂问题简单化,假设该链表只有两个数据,那么我们只需要将第二个链表的next指向第一个数据节点,然后再将头指向第二个节点是不是就大功告成啦。
两个节点的逆序我们学会了,那三个节点的链表呢,是不是在两个节点逆序的基础上将第三个节点指向新的第一个节点,然后再将头指针指向原第三个节点。这样子是不是也大功告成啦。那么第四个第五个即更多是不是也是这个道理,而对于上诉过程的实现你们想到用什么了吗?只需要一个循环即可。
三、代码分析
在实现过程中,英文设计节点指向的改变,我们需要提前将节点后面的地址保存,以及链表头需要指向的第一个节点。
/*
*链表逆序,返回链表头
*@head:链表头
*
*/
Node* reverse_list(Node* head) {
if(NULL == head || NULL == head->next) return head;
Node* current = head->next;//当前节点,第一个节点
Node* pnext = current->next;//下一个节点
Node* pre_next = NULL;//保存节点
current->next = NULL;//断开
while(pnext) {//两个有效节点时进入
pre_next = pnext->next;//保存下一个节点
pnext->next = current;//后节点指向第一个节点
current = pnext;//更新第一个节点
pnext = pre_next;
}
head->next = current;//连接
return head;
}
在上诉代码中,Node* current 为第一个有效数据节点,该节点变量永远为第一个节点。
Node* pnext 为下一个节点,保存需要改变指向的节点,第一次逆序时为第二个节点,后续为第三个节点,依次下去。
Node* pre_next 保存的是pnext的下一个节点地址,当pnext指向改变时后续节点将会找不到,因此需要一个节点进行保存。
在逆序结束后原第一个数据节点变为最后一个,所有一开始先将 current 的 next 至空。
当 pnext 存在时进行循环,不断将下一个节点的next指向最开始的节点,在 pnext 进行指向改变后该节点会成为新的第一个节点,因此需要将 current 重新接收 pnext 的地址,然后让 pnext 指向它原本的下一个位置继续循环,即pre_next。
最后让链表头指向逆序后的第一个节点,返回该头节点地址即可。
最后祝大家学业有成,工作顺利,天天开心。