力扣题---反转链表

我们先了解题目的原理

当链表为

5 4 3 2 1

反转后就是

1 2 3 4 5

我的思路首先是想到双指针 让指针去指向前一个节点和后一个节点

     让后一个节点(n2)去指向前一个节点(n1)

但是这个节点有一个致命的错误 就是让后一个节点(n2)指向前一个节点(n1)时 后一个节点(n2)无法再找到下一个节点(因为你已经改变了n2的指向) 所以双指针的思路是不行的

那么我们要思考的点是 我们怎么样让后一个节点继续找到下一个节点呢?

我们可以再创建一个指针 指向n2的后一个节点n3

这样就成了一个思路 假设n1指向第一个节点 n2指向第二个节点 n3指向第三个节点

让n2指向n1 再让n1放在n2的位置 再把n2放到n3的位置

这里需要注意 因为是反转 那么第一个位置会变成最后一个位置 链表的最后一个位置是指向NULL的,所以n1开始需要指向NULL 让n2第一个节点指向NULL 

因为是要n2指向最后一个节点 再让最后一个节点指向前一个节点 那么我们的结束条件就是n2!=NULL(可以简化为n2)

还有顺序一定不能乱 n1 n2 n3改变位置的顺序不能乱 否则会死循环 (要多画图)

最后返回的是n1 因为是反转后 n1才是指向链表的头 如果你返回的是head 返回的是链表的尾

struct ListNode* reverseList(struct ListNode* head){
  struct ListNode* n1=NULL;
  struct ListNode* n2=head;
  while(n2)
  {
      struct ListNode* n3=n2->next;
      n2->next=n1;
      n1=n2;
      n2=n3;
  }
  return n1;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值