首页 > 代码库 > LeetCode: Reverse Linked List II [092]
LeetCode: Reverse Linked List II [092]
【题目】
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满足 1<=m<=n<=链表长度。
【思路】
先确定要反转的子链表的首尾节点,把子链表拎出来单独做反转。待反转完成之后链回到原来的链表中。【代码】
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverse(ListNode*head){ if(head==NULL || head->next==NULL)return head; ListNode*prev=NULL; ListNode*cur=head; ListNode*next=NULL; while(cur){ next=cur->next; cur->next=prev; prev=cur; cur=next; } return prev; } ListNode *reverseBetween(ListNode *head, int m, int n) { if(head==NULL)return head; if(head->next==NULL)return head; if(m==n)return head; int sublinkLen = n-m+1; ListNode* prev=NULL; //指向subhead的前一个节点 ListNode* subhead=head; ListNode* subtail=head; ListNode* next=NULL; //指向subtail的后一个节点 //subtail先向前移sublinkLen-1了节点 int count=0; while(count<sublinkLen-1){ subtail=subtail->next; count++; } //此时subhead和subtail正好限定了一个长度为sublinkLen的窗口 //平移窗口,使得subhead指向第m个节点,subtail指向第n个节点 count=1; while(count<m){ prev=subhead; subhead=subhead->next; subtail=subtail->next; count++; } next=subtail->next; subtail->next=NULL; subtail=subhead; //反转之后的尾节点 subhead=reverse(subhead); //反转链表 if(prev)prev->next=subhead; //链接会原链表 else head=subhead; subtail->next=next; return head; } };
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。