题目描述
题目链接:206. 反转链表 - 力扣(LeetCode)
分析题目
思路一
我们可以设计算法让整个链表掉头
定义三个代码n1,n2,n3
n1指向NULL,n2指向head,n3指向第二个结点
当n2不为NULL的时候,让n2->next反方向指向n1,然后n1,n2,n3都往后移动
当n3走到NULL的时候,会出现空指针的问题,这个时候我们给n3单独加一个判断
if(n3!=NULL),n3=n3->next
注意:我们没有交换值,而是改变了指针的指向
另外,当链表本身为空的时候,直接返回NULL,所以我们也需要加一个判断链表为空的条件
思路二
定义一个newhead指向NULL作为新链表的头,定义cur指向原链表的第一个结点,next保存第二个结点
然后将cur尾插,newhead作为新的头,cur走到原链表的第二个结点,next指向next->next
最后,当cur不为空的时候,则进入循环,为了防止next成为空指针,我们加一个判断:
if(next!=NULL),则next=next->next
同样的,当链表本身为空的时候,直接返回NULL,所以我们也需要加一个判断链表为空的条件
代码示例
代码一
根据思路一,我们可以写出下面的代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
if(head==NULL)
{
return NULL;
}
struct ListNode* n1=NULL;
struct ListNode* n2=head;
struct ListNode* n3=n2->next;
while(n2)
{
n2->next=n1;
n1=n2;
n2=n3;
if(n3)
n3=n3->next;
}
free(n3);
free(n2);
return n1;
}
结果就通过了
代码二
根据思路二,我们可以写出下面的代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
if(head==NULL)
{
return NULL;
}
struct ListNode* newhead=NULL;
struct ListNode* cur=head;
struct ListNode* next=cur->next;
while(cur)
{
cur->next=newhead;
newhead=cur;
cur=next;
if(next)
next=next->next;
}
free(next);
free(cur);
return newhead;
}
同样,结果也可以通过
以上就是解这道题的两个思路