单链表反转是一道很基本的算法题。有几种实现方式,这里介绍其中一种实现方式。
这种实现方式的核心思想是通过三个指针pre,cur和next遍历整个链表,同时改变cur指针的next域。
数据结构定义:
typedef struct Node
{<pre name="code" class="cpp">
int value; struct Node *next;}LNode, *LinkList;
函数实现:
LinkList revert_list(LinkList pHead)
{
if (pHead == NULL || pHead->next == NULL)
return pHead;
LNode *pre, *cur, *next;
pre = next = NULL;
cur = pHead;
while(cur)
{
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
pHead = pre;
return pHead;
}
由于需要将cur的next域指向pre,改变其指向的节点,因此用next指针保存cur指针的next域、反转节点顺序后,将pre指针和cur指针分别前移,即pre指针移到cur的位置,cur指针移到next的位置。依此规则遍历链表的同时,将链表进行反转、最后一次操作后pre指针位于原链表的尾节点,cur指针为空指针。因此将pHead指向pre所指的节点,即完成了链表反转。