49-Reverse Linked List II

本文介绍了一种在给定范围内反转链表的有效算法。该算法能在O(n)的时间复杂度和O(1)的空间复杂度下完成任务,适用于从m到n的位置间进行链表元素的反转操作。
  1. Reverse Linked List II My Submissions QuestionEditorial Solution
    Total Accepted: 70579 Total Submissions: 252986 Difficulty: Medium
    Reverse a linked list from position m to n. Do it in-place and in one-pass.

For example:
Given 1->2->3->4->5->NULL, m = 2 and n = 4,

return 1->4->3->2->5->NULL.
思路:
时间复杂度: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* reverseBetween(ListNode* head, int m, int n) {
            assert(n>=m);
            if(m==n)return head;
            int i=1,j=1;
            ListNode *p=head,*q=head,*prep=NULL;//保留指定段首元素的前一元素
            while(p!=NULL&&i++<m){
                if(i==m)prep=p;
                p=p->next;
            }
            while(q!=NULL&&j++<n)q=q->next;/找到各自的最终位置,越界为空
            if(p==NULL)return head;       //起始位置越界,直接返回head
            ListNode * tmp = p->next,*prenode = p,*qnext=q->next;
            while(tmp!=qnext)         //还未到达指定段的下一元素,则当前元素指向前一元素
            {  
                ListNode *nextnode = tmp->next;
                tmp->next = prenode;
                prenode = tmp;
                tmp = nextnode;
             }
             p->next = qnext;
             if(prep!=NULL)prep->next = prenode;
             else head = prenode;
             return head;
        }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值