92 Reverse Linked List II

本文介绍了一种在单次遍历中反转链表中指定范围内的节点的算法,包括特殊情况处理和递归实现。

92 Reverse Linked List II

链接:https://leetcode.com/problems/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的元素求逆序。找到第m,n个元素就好操作了。特别需要注意当m=1时候的情况。

class Solution {
public:
    ListNode* reverseList(ListNode* head)
    {

        ListNode *t=new ListNode(0),*cur=NULL;
        t->next=head;
        cur=head;
        head=head->next;
        cur->next=NULL;
        while(head)
        {
            t->next=head;
            head=head->next;
            t->next->next=cur;
            cur=t->next;

        }
        cur=t->next;
        delete t;
        return cur;
    }

    ListNode* reverseBetween(ListNode* head, int m, int n) {

         if(head==NULL||head->next==NULL||m==n)
                return head;
          ListNode  *t=head,*p1=head,*h1=head,*p2,*h2;
          int length=1;
          while (length!=m)
          {
            length++;
            p1=h1;
            h1=h1->next;
          }
          p2=h1;
          h2=h1->next;
          while(length!=n)
          {
          length++;
          p2=h2;
          h2=h2->next;
          }
          p2->next=NULL;
          if(p1==h1)
              head=reverseList(h1);
          else
          p1->next=reverseList(h1);

          h1->next=h2;
          return head;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值