[LeetCode] Reverse Linked List II 倒置链表之二

本题是要对链表区间内的数据进行翻转,如下图所示。

如果是数组,知道起始位置m和终止位置n的下标,即可通过中间变量根据下标中心对称进行数据交换,如下图所示。

现在针对链表操作,无法直接对下标操作,只能根据地址指针对数据进行串联。假如是针对整个链表进行翻转,该如何思考呢,直观想法是开辟新的链表,然后原链表中的元素依次作为新链表的头结点,即如下所示。

Reverse Linked List II是针对链表区间进行翻转,此时针对整个链表翻转的思路依然可以借鉴,即每次将当前位置的元素移动到起始位置(m位置处),为记录位置信息,针对原链表设置了两个变量,prev(m-1位的结点)和cur(m位的结点),然后对其next值进行变量替换。

ListNode *reverseBetween(ListNode *head, int m, int n) {
        ListNode *dummy = new ListNode(-1), *pre = dummy;
        dummy->next = head;
        for (int i = 0; i < m - 1; ++i) pre = pre->next;
        ListNode *cur = pre->next;  //cur为m位置的元素
        for (int i = m; i < n; ++i) {
            ListNode *t = cur->next;  
            cur->next = t->next;      
            t->next = pre->next;      
            pre->next = t;      //变量替换,仅更新pre和cur的next值,不更新pre和cur结点的value值
        }
        return dummy->next;
    }

更一般的理解,就是对交换两个变量的值(pre->next, cur->next),处理流程等同于相邻两结点交换的逻辑

参考文献:

  1. [LeetCode]链表倒置II
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值