算法讲解-左神 【5】单双链表及其反转

/*
 * Definition for singly-linked list.
 */
 struct ListNode {
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
 };

 //双链表节点
 struct DoubleListNode {
     int val;
     DoubleListNode* next;
     DoubleListNode* last;
     DoubleListNode() : val(0), next(nullptr), last(nullptr) {}
     DoubleListNode(int x) : val(x), next(nullptr), last(nullptr) {}
     DoubleListNode(int x, DoubleListNode* next, DoubleListNode* last) : val(x), next(next), last(last) {}
 };

 class Solution {
 public:
     //反转单链表
     ListNode* reverseList(ListNode* head) {
         ListNode* prev = nullptr;
         ListNode* curr = head;
         while (curr) {
             ListNode* next = curr->next;
             curr->next = prev;
             prev = curr;
             curr = next;
         }
         return prev;
     }

     //递归方式反转单链表
     ListNode* reverseList(ListNode* head) {
         // 链表为空时直接返回,链表不为空则到返回最后一个节点
         if (!head || !head->next) {
             return head;
         }
         // newHead先指向最后一个节点,注意此时参数是倒数第二个节点
         // 这一步很精妙,每一次newHead都是指向空指针(链表为空)或保留在原链表中的最后一个节点(链表不空),作用就是返回新的头结点
         ListNode* newHead = reverseList(head->next);
         // 最后一个节点指向倒数第二个节点
         head->next->next = head;
         // 倒数第二个节点的下一节点置空。此时倒数第三个节点仍指向倒数第二个节点,下一次递归中将倒数第二个节点下一节点指向倒数第三个节点,不断重复这一过程
         head->next = nullptr;
         return newHead;
     }

     //反转双链表
     DoubleListNode* reverseDoubleList(DoubleListNode* head) {
         DoubleListNode* prev = nullptr;
         DoubleListNode* curr = head;
         while (curr != nullptr) {
             DoubleListNode* next = curr->next;
             curr->next = prev;
             curr->last = next;
             prev = curr;
             curr = next;
         }
         return prev;
     }
 };

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值