当前位置:   article > 正文

LeetCode 206. 反转链表

206. 反转链表

目录

1.原题链接:

2.双指针:

代码实现: 

①.C语言版: 

②.C++版:

3.头插:

代码实现:

①.C语言版:

②.C++版:

4.递归:

从左往右递归:

代码实现:

①.C语言版: 

②.C++版:

从右往左递归:

代码实现:

①.C语言版:

②.C++版:

5.提交结果:

6.读书分享:


1.原题链接:

206. 反转链表

2.双指针

我们可以用两个指针,一个指向第一个结点,一个指向第二个结点,然后让后一个结点指向前一个节点就好了,但是如果只使用两个指针会存在一个问题:当让后一个结点指向前一个结点的时候,后面的结点会找不到。所以这里需要三个指针方便后续操作。并且最开始要让最左边指针指向NULL,因为反转后的链表最后一个结点后面也会指向NULL。

代码实现: 

①.C语言版: 

  1. struct ListNode* reverseList(struct ListNode* head) {
  2. typedef struct ListNode ListNode;//重命名
  3. ListNode* left = NULL;
  4. ListNode* mid = head;
  5. ListNode* right;//防止找不到后面的结点
  6. while (mid!=NULL)
  7. {
  8. right = mid->next;
  9. mid->next = left;
  10. left = mid;
  11. mid = right;
  12. // right=right->next;//如果这样写会存在对空指针的访问
  13. }
  14. return left;
  15. }

②.C++版:

  1. class Solution {
  2. public:
  3. ListNode* reverseList(ListNode* head) {
  4. ListNode* left = NULL;
  5. ListNode* mid = head;
  6. ListNode* right;//防止找不到后面的结点
  7. while (mid!=NULL)
  8. {
  9. right = mid->next;
  10. mid->next = left;
  11. left = mid;
  12. mid = right;
  13. // right=right->next;//如果这样写会存在对空指针的访问
  14. }
  15. return left;
  16. }
  17. };

3.头插:

代码实现:

①.C语言版:

  1. struct ListNode* reverseList(struct ListNode* head) {
  2. typedef struct ListNode ListNode;
  3. ListNode* cur=head;
  4. ListNode* newHead=NULL;
  5. while(cur!=NULL)
  6. {
  7. ListNode* next=cur->next;//放在里面不会引起访问空指针的问题
  8. cur->next=newHead;
  9. newHead=cur;
  10. cur=next;
  11. }
  12. return newHead;
  13. }
②.C++版:
  1. class Solution {
  2. public:
  3. ListNode* reverseList(ListNode* head) {
  4. ListNode* cur=head;
  5. ListNode* newHead=NULL;
  6. while(cur!=NULL)
  7. {
  8. ListNode* next=cur->next;//放在里面不会引起访问空指针的问题
  9. cur->next=newHead;
  10. newHead=cur;
  11. cur=next;
  12. }
  13. return newHead;
  14. }
  15. };

4.递归:

从左往右递归:

此方法跟三个指针的方法相似,应该会稍微好理解些。

开始进入递归函数

 完成第一次反转:

  递归反转:

代码实现:

①.C语言版: 
  1. struct ListNode* reverse(struct ListNode* pre,struct ListNode* cur)
  2. {
  3. if(cur==NULL)//递归出口
  4. return pre;
  5. struct ListNode* late=cur->next;
  6. cur->next=pre;
  7. return reverse(cur,late);
  8. }
  9. struct ListNode* reverseList(struct ListNode* head){
  10. return reverse(NULL,head);
  11. }
②.C++版:
  1. class Solution {
  2. public:
  3. ListNode* reverse(ListNode* pre,ListNode* cur)
  4. {
  5. if(cur==NULL)//递归出口
  6. return pre;
  7. ListNode* late=cur->next;
  8. cur->next=pre;
  9. return reverse(cur,late);
  10. }
  11. ListNode* reverseList(ListNode* head) {
  12. return reverse(NULL,head);
  13. }
  14. };

从右往左递归:

先递归到最后一个结点后,回来时再反转。

代码实现:

①.C语言版:
  1. struct ListNode* reverseList(struct ListNode* head){
  2. typedef struct ListNode ListNode;
  3. if(head==NULL||head->next==NULL)//递归结束条件
  4. return head;
  5. ListNode* newHead=reverseList(head->next);//开始进入
  6. head->next->next=head;
  7. head->next=NULL;
  8. return newHead;
  9. }
②.C++版:
  1. class Solution {
  2. public:
  3. ListNode* reverseList(ListNode* head) {
  4. if(head==NULL||head->next==NULL)//递归结束条件
  5. return head;
  6. ListNode* newHead=reverseList(head->next);//开始进入
  7. head->next->next=head;
  8. head->next=NULL;
  9. return newHead;
  10. }
  11. };

5.提交结果:

6.读书分享:

道德经·第三十七章》:

不欲以静,天下将自定。

解释:不起贪欲而趋于平静,天下便自然复归于安定。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/882100
推荐阅读
相关标签
  

闽ICP备14008679号