剑指二刷24:反转链表(双指针/递归)

题目:

题解1:

在一刷时采用双指针(加一个临时指针)的方法,不耗费额外空间。

时间复杂度:O(n)

空间复杂度:O(1)

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head == NULL)return NULL;
        ListNode* pre;
        ListNode* cur;
        pre = head;
        cur = NULL;
        while(pre != NULL)
        {
            ListNode* tmp = pre->next;//临时指针,保存pre的下一个节点地址
            pre->next = cur;
            cur = pre;
            pre = tmp;
        }
        return cur;
    }
};

题解2:

二刷学习的方法,很简洁,思路也很骚,学会递归还是有点东西的。

  •  使用递归函数,一直递归到链表的最后一个结点,该结点就是反转后的头结点,记作 newhead 。
  • 此后,每次函数在返回的过程中,让当前结点的下一个结点的next->next指针指向当前节点。
  • 同时让当前结点的next->next指针指向NULL,从而实现从链表尾部开始的局部反转。
  • 当递归函数全部出栈后,链表反转完成。

递归的本质就是栈,将节点递进到结尾,回归时将节点方向反转。

转作者huwt的动画,链接如下。
链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/solution/fan-zhuan-lian-biao-yi-dong-de-shuang-zhi-zhen-jia/
 

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (head == NULL || head->next == NULL) {
            return head;//当head为空 或者 节点到达尾结点时,返回head为新首节点
        }
        ListNode* ret = reverseList(head->next);//递进
        //从尾部开始一步步改变节点方向
        head->next->next = head;
        head->next = NULL;
        return ret;//返回的始终是head节点
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
let arr = [{ name: '青苹果', header: '"https://img0.baidu.com/it/u=1348709467,3751255405&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200"', comment:"听说今天要使用递归实现评论列表", children: [{ name: "洗发水", header: '"https://img0.baidu.com/it/u=1348709467,3751255405&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200"', comment:"听说今天要使用递归实现评论列表", children: [{ name: '北方米饭', header: '"https://img0.baidu.com/it/u=1348709467,3751255405&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200"', comment:"听说今天要使用递归实现评论列表", }, { name: '南方米饭', header: '"https://img0.baidu.com/it/u=1348709467,3751255405&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200"', comment:"听说今天要使用递归实现评论列表", }] }, { name: "沐浴露", header: '"https://img0.baidu.com/it/u=1348709467,3751255405&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200"', comment:"听说今天要使用递归实现评论列表", }] }, { name: '红苹果', header: '"https://img0.baidu.com/it/u=1348709467,3751255405&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200"', comment:"听说今天要使用递归实现评论列表", children: [{ name: "锄头", header: '"https://img0.baidu.com/it/u=1348709467,3751255405&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200"', comment:"听说今天要使用递归实现评论列表", }, { name: "锤子", header: '"https://img0.baidu.com/it/u=1348709467,3751255405&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200"', comment:"听说今天要使用递归实现评论列表", }] }]使用递归渲染在vue3页面出层级
06-10
可以考虑使用Vue3的递归组件来实现树形结构的渲染。 首先,在template中定义一个递归组件,例如: ``` <template> <div class="comment"> <div class="comment-header"> <img :src="header" alt="header"> <span>{{ name }}</span> </div> <div class="comment-content">{{ comment }}</div> <div class="comment-children"> <comment v-for="child in children" :key="child.name" :data="child"></comment> </div> </div> </template> <script> export default { name: 'comment', props: { data: { type: Object, required: true } } } </script> ``` 在递归组件中,使用v-for来遍历当前节点的子节点,并将子节点作为递归组件的props传递下去,直到遍历到叶子节点。 然后,在父组件中使用递归组件来渲染整个树形结构,例如: ``` <template> <div class="comment-list"> <comment v-for="item in arr" :key="item.name" :data="item"></comment> </div> </template> <script> import Comment from './Comment.vue' export default { components: { Comment }, data() { return { arr: [{ name: '青苹果', header: 'https://img0.baidu.com/it/u=1348709467,3751255405&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200', comment: '听说今天要使用递归实现评论列表', children: [{ name: "洗发水", header: 'https://img0.baidu.com/it/u=1348709467,3751255405&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200', comment: '听说今天要使用递归实现评论列表', children: [{ name: '北方米饭', header: 'https://img0.baidu.com/it/u=1348709467,3751255405&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200', comment: '听说今天要使用递归实现评论列表', }, { name: '南方米饭', header: 'https://img0.baidu.com/it/u=1348709467,3751255405&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200', comment: '听说今天要使用递归实现评论列表', }] }, { name: "沐浴露", header: 'https://img0.baidu.com/it/u=1348709467,3751255405&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200', comment: '听说今天要使用递归实现评论列表', }] }, { name: '红苹果', header: 'https://img0.baidu.com/it/u=1348709467,3751255405&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200', comment: '听说今天要使用递归实现评论列表', children: [{ name: "锄头", header: 'https://img0.baidu.com/it/u=1348709467,3751255405&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200', comment: '听说今天要使用递归实现评论列表', }, { name: "锤子", header: 'https://img0.baidu.com/it/u=1348709467,3751255405&fm=253&fmt=auto&app=138&f=JPEG?w=200&h=200', comment: '听说今天要使用递归实现评论列表', }] }] } } } </script> ``` 在父组件中使用v-for来遍历整个树形结构的根节点,并将根节点作为递归组件的props传递下去。 这样就可以使用递归组件来实现树形结构的渲染了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值