题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
为了正确发转一个链表,需要调整链表中指针的方向。
如下图(a)如果把2结点next指针直接指向1结点,会造成链表断琏。所以我们需要调整next指针之前,把2结点的next指针指向的3结点保留下来。也就是说我们在调整结点2的next指针时,除了需要知道结点2本身之外,还需要2的前一个结点1,因为我们需要把结点2的next指针指向1。同时保存结点2的后一个结点3,防止结点断开。
如图b,我们需要3个指针,一个指向当前结点,一个指向当前结点的前一个结点,一个指向当前结点的后一个结点。
思路:
(1)nextNode先指向当前结点下一个结点
(2)pNode指向的结点的next指针指向前一个结点
(3)preNode 指针和pNode指针往前移一位
代码稳定性:
考虑三种情况:
(1)输入链表为空
(2)链表只有一个结点
(3)链表有多个结点
代码:
struct node
{
int value;
node* next;
};
/*实现链表反向
*输入:链表头节点
*输出:反向后的链表头节点,或者null(链表为空的时候),或者头结点(链表只有一个结点的时候)
*/
node* reserveList(node* head)
{
node* preNode=NULL;
node* pNode=head;
while(pNode!=NULL)
{
if(pNode->next==NULL)return pNode;
//实现反转
node* nextNode=pNode->next;
pNode->next=preNode;
//往前移
preNode=pNode;
pNode=nextNode;
}
return preNode;
}