leetcode之92. Reverse Linked List II(C++读错题版本,交换一个链表中指定的两个位置上的元素)

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.
*****************************我是分割线************************
真的是没有读懂题啊,看例题真的是以为两个位置交换啊,英语不好好坑爹啊,程序写的也是乱,凑合看吧,意思还是这个意思,嘻嘻~~~~~~~~
******************************我是另外一条分割线****************

/**
 * 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 || !head->next ||m==n) return head;
    ListNode *p=head;
    ListNode *q=head;
    ListNode *pm;
    ListNode *pn;
    ListNode *pmp;
    ListNode *pnp;

      if(!head->next->next)
        {
            ListNode *second=head->next;
            second->next=head;
            head->next=nullptr;
            return second;

        }
        else
          if(1==m && 2==n)
        {
            ListNode *seconds=head->next;
            ListNode *third=head->next->next;
            seconds->next=head;
            head->next=third;
            return seconds;
        }
        else

    if(1==m)
    {
        int j=0;
        ListNode *pnp1;
        ListNode *pm1=head;
        ListNode *pn1;
        ListNode *p1=head;
        while(p1)
        {
            if(j==n-2)
            {
                pnp1=p1;
                pn1=p1->next;
                break;
            }
            else ;
            p1=p1->next;
            j++;
        }
        ListNode *temp1=pm1->next;
        pm1->next=pn1->next;
        pn1->next=temp1;
        if(pnp1==temp1)
        {
            pnp1->next=pm1;
            return pn1;
        }
        else
        {
            pnp1->next=pm1;
            return pn1;
        }
    }
    else
    {
        int i=0;
        while(p)
        {
            if(i==m-2)
            {
                pmp=p;
                pm=p->next;
            }
            else if(i==n-2)
            {
                pnp=p;
                pn=p->next;
                break;
            }
            else ;
            p=p->next;
            i++;
        }//i 就是链表的长度
        pmp->next=pn;
        ListNode *temp=pm->next;
        pm->next=pn->next;
        if(temp==pn)
        {
            pn->next=pm;
            return head;
        }
        else
        {
            pn->next=temp;
            pnp->next=pm;
        }
        return head;
    }
}
};

下一篇更正确版本,改不对宝宝不睡了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值