Reverse Linked List--206--单链表逆序

这篇博客探讨了LeetCode的206题——单链表逆序问题,提供了原地反转链表的思路和代码示例。通过使用三个指针pre、cur和temp,实现了链表的迭代反转。同时提到了递归解法作为一种替代方案。
摘要由CSDN通过智能技术生成

这是本专栏的第一篇博客,还是要说几句哈。读到博客的小伙伴,我已经默认你有一定的计算机基础(抑或找工作的经验了),所以就不再解释每道题目的含义了,除非特别绕口的,本博客主要是提供一种思路和一个勉强能运行的代码示例,可能不是最优解,所以还想通过博客的方式跟大家一起探讨一二。

题目描述:单链表的逆序,就是反转链表

Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL

思路:本文提供一种原地反转的方法,想象就地箭头转过来的样子,三个指针

  • 第一个指针是一个指向NULL的指针pre,这个指针就是后面反转后的头节点
  • 第二个指针指向当前头节点的指针cur,这个指针后续会一直向前移动
  • 第三个指针是一个临时指针,用来保存cur的next指针(保证链表不会断掉),这个指针后续也会一直向前移动
  • 一定要注意判断头节点是否为空,不然就是思路不周详
#include<iostream>
#include<vector>
#include<string>

 using namespace std;

struct ListNode//单链表的定义
{
    int data;
    ListNode* next;
    ListNode(int x):data(x), next(NULL){}//初始化
};

//输出链表
void show(ListNode* head)
{
    if(head == NULL)
    {
        cout << "nullptr" << endl;
    }
    ListNode* p = head;
    while(p)
    {
        cout << p->data << endl;
        p = p ->next;
    }
   
}
 class Solution
 {
     public:
     ListNode* reverseList(ListNode* head)
     {
         if(head == NULL) return head;//一定要注意判断头节点是否为空,不然就是思路不周详
         ListNode* pre = NULL;
         ListNode* cur = head;
         while(cur)
         {
             ListNode* temp = cur->next;
             cur->next = pre;
             pre = cur;
             cur = temp; 
         }
         return pre;//返回值一定是链表的头节点,这样才可以后续引用这个链表
     }
    
 };

 int main()
 {
     Solution s;
     ListNode* head = new ListNode(1);
     ListNode* node, *p;
     p =head;
     for(int i = 2; i <= 8; ++i)
     {
         node = new ListNode(i);
         p->next = node;
         p = node;
     }
     show(head);
     ListNode* h = s.reverseList(head);
     show(h);
     return 0;
 }

如果不能理解,可以插播一张图片解释(图片出自男朋友之手)
在这里插入图片描述

上述是一种迭代的算法,同样可以采用递归的算法

ListNode* reverseList(ListNode* head) {
        if (head == NULL || head->next == NULL) return head;
        ListNode* p = reverseList(head->next);
        head->next->next = head;
        head->next = NULL;
        return p;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值