题目描述
题目分析
这个是一个热门题,很多校招,笔试什么的频繁出现。
简单读题后我们基本了解它是要求我们实现什么
就是将链表倒置, 如图:
既然题目并没有对时间复杂度和空间复杂度有要求,那我们就直接上手吧
解决方案
思路一:翻指针方向
先用三个指针,让n1指向NULL,n2指向链表第一个结点,n3链表第二个结点,如图:
一般来说重复过程的程序分为三步:
- 初始条件
我们初始条件就是用三个指针,分别指向空,第一个结点和第二个结点。- 迭代过程
第一步:让n2指向n1,这一步就实现了链表第一个结点的翻转
第二步:让上面三个指针分别向后移动一个结点(将n1指向n2;再让n2指向n3;最后使n3指向它的下一个结点n3->next)。- 结束条件
我们迭代过程中的第一步是让n2去翻转,那么就当n2指向NULL的时候截止。
过程如图:
思路一代码:
struct ListNode* reverseList(struct ListNode* head){
if(head==NULL)
return NULL;
//初始条件
struct ListNode*n1=NULL,*n2=head,*n3=n2->next;
while(n2!=NULL)//结束条件
{
//迭代过程
n2->next=n1;
n1=n2;
n2=n3;
if(n3)
n3=n3->next;
}
return n1;
}
思路二:头插法
顾名思义,头插法就是沿用头插的思想。先新建一个链表,将旧链表中的结点以头插的方式放到新链表中即可。
第一步: 定义一个指针指向head,在定义一个新链表newHead。
第二步:定义一个next用来记录cur后面那一个结点,将cur指向的结点放到newHead前面,再将newHead指向cur,cur再向后走。
旧链表head的流程图:
新链表newHead的流程图:
思路二代码:
struct ListNode* reverseList(struct ListNode* head){
struct ListNode*cur=head;
struct ListNode*newHead=NULL;
while(cur!=NULL)
{
struct ListNode*next=cur->next;
//头插
cur->next=newHead;
newHead=cur;
cur=next;
}
return newHead;
}