题目 :反转链表
题目描述
思路
- 第一种:首先想到的是,创建一个新的结点newhead,然后将尾结点尾插到newhead后面,但是单链表找尾结点不方便,也不好记录尾结点的上一个结点。
*第二种: 换另一种,改变链表指针的指向,用三个指针变量分别标记。两个指针用来反转指向,第三个指针用来保存第三个结点,用于继续下一步改变指向。
接下来用第二种方法来解决。
(原来的头结点要指向NULL,head->next->head;)
以下用画图来说明:
cur=NULL;
prev=NULL;
next=head;
prev=next->next;//用来保存next->next;
next->next=cur;//改变指针指向
- 如图,当next为空时循环结束,把所有的指向都改变了,cur指向新的头结点,作最后返回链表头指针的地址。
- 迭代循环
while(next)
{
prev=next->next;
//反转指针方向
next->next=cur;
//迭代(循环)
cur=next;
next=prev;
}
代码
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode* cur=NULL;
struct ListNode* next=head;
struct ListNode* prev=NULL;
while(next)
{
prev=next->next;
next->next=cur;
//迭代
cur=next;
next=prev;
}
head=cur;
return head;
}