leetcode 反转链表

本文详细介绍了链表的反转算法,包括单向链表和双向链表,并探讨了如何将二叉搜索树转换为有序的双向链表。通过具体的代码示例,阐述了中序遍历和指针转换的方法,强调了指针引用在改变指针所指对象时的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

key:

1. 定义三个指针,cur;newhead;cur的前一个结点 pre

2.判断最后一个结点,直接赋值给newhead

*** 如果是双向链表,就是多了一步往前的指针处理

**** 如果是将二叉搜索树转换成有序的双向链表,也是一样的:中序遍历 + 根节点处的指针转换;

同时要注意对于参数pre,要用*&

解释:指针是一个存放地址的变量,而指针引用指的是这个变量的引用,众所周知C++中如果参数不是引用的话会调用参数对象的拷贝构造函数,所以如果有需求想改变指针所指的对象(换句话说,就是要改变指针里面存的地址),就要使用指针引用,

参考链接:https://www.cnblogs.com/jiasq/p/8637982.html

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
         if(pHead == NULL) return NULL;
         ListNode* cur = pHead;
        ListNode* newhead = NULL;
        ListNode* pre = NULL;
        while(cur){
            ListNode* temp = cur->next;
            if(temp == NULL) newhead = cur;
            cur->next = pre;
            pre = cur;
            cur = temp;
        }
        return newhead;
    }
};
 DoubleNode* reverseList(DoubleNode *head)
  { //双向链表
     DoubleNode *pre = NULL;
     DoubleNode *next = NULL;
  
      while(NULL != head)
      {
          next = head->next;
          head->next = pre;
          head->pre = next;    //多了一步前置处理
          pre = head;
          head = next;
      }
      return pre;
  }
//二叉搜索树 转换为有序的双向链表
 TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree == nullptr) return nullptr;
        TreeNode* pre = nullptr;
        dfs(pRootOfTree,pre);
        TreeNode* res = pRootOfTree;
        while(res->left) res = res->left;
        return res;
        
    }
    void dfs(TreeNode* cur,TreeNode*& pre){
 //必须要加取地址的操作,因为pre是动态变化的,如果不加的话,调用结束后很可能pre没有变化,一直为空


        if(cur == nullptr) return;
        dfs(cur->left, pre);
        cur->left = pre;
        if(pre) pre->right = cur;
        pre = cur;
        dfs(cur->right, pre);        
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值