【leetcode每日一题】NO92.Reverse Linked List II

题目: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.

Note:
Given m, n satisfy the following condition:

1 ≤ m ≤ n ≤ length of list.

也就是对给定的链表,进行中间部分的倒序。

解析:根据给定的m和n值,我们先找到要排序链表部分的起始节点和结束节点,然后对这部分进行排序,再把整个链表连接起来就可以了。

代码:

/**
 * 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) {
        if(head==NULL||head->next==NULL)
            return head;
        ListNode *first=head;
        ListNode *last=head;
        ListNode *nowNode,*preNode,*nextNode,*temp1,*temp2;
        for(int i=0;i<m-2;i++)
            first=first->next;
        for(int i=0;i<n-1;i++)
            last=last->next;
        if(m==1)
        {
            temp1=first;
            nowNode=first;
        }
        else
        {
            temp1=first->next;
            nowNode=first->next;
        }
        temp2=last->next;
        preNode=NULL;
        while(nowNode!=temp2)
        {
            nextNode=nowNode->next;
            nowNode->next=preNode;
            preNode=nowNode;
            nowNode=nextNode;
        }
        first->next=last;
        temp1->next=temp2;
		if(m==1)
			head=last;
        return head;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值