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.
//关键点有四个,1.第m-1个点,2.第m个点,3.第n个点,4.第n+1个点
//关键点有四个,1.第m-1个点,2.第m个点,3.第n个点,4.第n+1个点 class Solution { public: ListNode *reverseBetween(ListNode *head, int m, int n) { ListNode *before, *start, *end, *after; before = after = start = end = NULL; ListNode *ptr = head; for (int i = 1; i < m; i++) { before = ptr; ptr = ptr->next; } start = end = ptr; for (int i = m; i <= n; i++) { after = ptr->next; ptr->next = end; end = ptr; ptr = after; } if (before == NULL) { head = end; } else { before->next = end; } start->next = after; return head; } };
#include<iostream> using namespace std; #define N 5 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: ListNode *reverseBetween(ListNode *head, int m, int n) { ListNode *before, *start, *end, *after; before = after = start = end = NULL; ListNode *ptr = head; for (int i = 1; i < m; i++) { before = ptr; ptr = ptr->next; } start = end = ptr; for (int i = m; i <= n; i++) { after = ptr->next; ptr->next = end; end = ptr; ptr = after; } if (before == NULL) { head = end; } else { before->next = end; } start->next = after; return head; } }; ListNode *creatlist() { ListNode *head = NULL; ListNode *p; for(int i=0; i<N; i++) { int a; cin>>a; p = (ListNode*) malloc(sizeof(ListNode)); p->val = a; p->next = head; head = p; } return head; } int main() { ListNode *list = creatlist(); Solution lin; int a ,b; cin>>a; cin>>b; ListNode *outlist = lin.reverseBetween ( list,a,b ); for(int i=0; i<N; i++) { cout<<outlist->val; outlist = outlist->next; } }
leetcode_92_Reverse Linked List II
原文地址:http://blog.csdn.net/keyyuanxin/article/details/43833333