0.题目
定义一个函数,输入链表的头结点,然后输出反转后链表的头结点,链表的结点定义如下:
typedef struct Node
{
DataType data;
struct Node * next;
}*pNode,*pLinkList;
1. 解题思路
- 方法一:重新开辟一条链表,然后依次取下原链表的每个结点头插入到新的链表中,新的链表就是逆置的结果
void Reverselist(pLinkList *ppl)
{
assert(ppl);
pNode cur = *ppl;
pNode tmp = NULL;
pLinkList head = NULL;
assert(ppl != NULL);
//如果链表中只有一个结点或者没有结点,不用反转
if (*ppl == NULL || (*ppl)->next == NULL)
{
return;
}
while (cur)
{
//保存下一个结点,否则会丢失链表后边的内容
tmp = cur->next;
//头插
cur->next = head;
head = cur;
//改变指向指向下一个继续
cur = tmp;
}
*ppl = head;
}
- 方法二:定义三个指针,一个是指向当前结点,一个指向当前结点的前一个结点,另一个是指向当前结点的后一个结点,依次改变当前结点的next域,让它指向前一个结点,然后在切换prev和cur,继续改变指针,直到cur为空
pNode Reverselist(pLinkList *ppl)
{
assert(ppl != NULL);
pLinkList reverselist = NULL;
pNode curnode = *ppl;
pNode prev = NULL;
while (curnode)
{
pNode next = curnode->next;//保留下一个结点
if (next == NULL)
{
reverselist = curnode;
}
//改变指向前一个结点
curnode->next = prev;
//调整prev、curnode继续
prev = curnode;
curnode = next;
}
return reverselist;
}