206.反转链表

d83e0f87352b4abaa7abc011d1c59159.png

 (1)使用双指针

 10bfd580ab3345cda4dbd906c685fb33.png

(1)一开始定义两个指针cur和prev,cur指向第一个节点,prev指向空。

(2)然后将cur->next指向prev ,实现第一次反转,但是如果直接改cur->next,那么下一个节点就找不到了,为了方便起见,再定义一个指针next,保存cur的下一个节点。

af0c66686d924145aee186f7b655e09d.png

(3)不断地使cur->next=prev,实现反转,然后向后迭代,如何迭代,只需要将prev=cur; cur=next;就可以实现,直到将所有数据反转。

6834eb7dbddc4e76bf121cc07cc98a1f.png

 

(4)可见,当cur为空时就结束。

代码为:

struct ListNode* reverseList(struct ListNode* head){
struct ListNode *prev=NULL;
struct ListNode *cur=head;
if(head==NULL)
{
    return head;
}
while(cur)
{  struct ListNode * next=cur->next;  //如果把next定义到外面,就要判断next为空的情况
    cur->next=prev;
    prev=cur;
    cur=next;
}
return prev;
}

(2)采用头插法 

 

(1)定义两个指针,一个为cur,指向第一个节点 。一个为newnode,是新节点的头指针。

dcab63ba74fd4598ad481f607982710d.png

 (2)和上面一样,为了迭代方便,再定义一个指针next保存cur的下一个的节点的地址。

(3)然后把每个节点都拿下来头插,如图。

b1d940bd507e4ef096976b3e37d54da9.png

(4) 每一次头插完之后,要将 newnode指向此时新的头,(因为newnode代表的是反转后新链表的头,如第一次将节点1头插完,此时节点1就是新链表的头,newnode就指向节点1)然后进行迭代,cur变成了next,next又指向下一个位置。过程如图:

6e5935f263b3425085647dfc30822b71.png

 (5)最后,在cur为空时就结束了,反转后的链表的头就为newnode。

 8dc1394ea72148c2bf1f23ef9abc3a52.png

 代码为:

 ListNode* reverseList(ListNode* head) {
ListNode *cur=head;
ListNode *newhead=NULL;
while(cur)
{
ListNode *next=cur->next;
cur->next=newhead;
newhead=cur;
cur=next;
}
return newhead;
    }

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值