面试题:反转链表
程序员文章站
2022-05-12 22:23:50
...
面试题:反转链表
思路:要实现链表反转,需要调整链表中指针方向,使链表反转后的头结点为原链表的尾结点。为了防止结点断裂,需定义三个指针,分别指向当前遍历的结点,它的前一结点以及后一个结点。
当然编写代码时要考虑到下列三点(防止程序崩溃):
- 链表为空
- 链表只有一个结点
- 链表有多个结点
将思路用代码实现为
SListNode* node=pHead; //当前结点
SListNode* prev=NULL;//前一结点
SListNode* next=node->_next;//下一结点
//反转逻辑
prev=node->_next;
prev=node;
node=next;
完整实现代码:
#include <windows.h>
#include <assert.h>
#include "SList.h"
SListNode* ReverseSlist(SListNode* pHead)
{
//断言
assert(pHead);
SListNode* reversenode = NULL;
SListNode* prev = NULL;
SListNode* node = pHead;
while (node->_next != NULL)
{
SListNode* next = node->_next;
if (next == NULL)//一个结点
{
reversenode = node;
}
else
{
//多个结点
node->_next = prev;
prev = node;
node = next;
}
return reversenode;
}
}
int main()
{
SListNode* node = NULL;
SListPushBack(&node, 1);
SListPushBack(&node, 2);
SListPushBack(&node, 3);
SListPushBack(&node, 4);
SListPushBack(&node, 5);
SListPrint(node);
Reverselist(&node);
SListPrint(node);
system("pause");
return 0;
}
结果如下: