用插入法实现链表的倒序,对于是否从第一个元素开始的情况分别对待,没测试提交,第一次居然犯了太低级的错误了;这题给出了一个前提保证了m小于等于n小于等于链表长度,所以程序里不用担心链表在任何时候走过了(那样的话处处都得判断指针是否为空),我想说的是在没给出这样条件的时候,自己编程时也应该这样考虑,编写的函数假设输入合法,对于不合法的输入应该预先做一下判断,并且封装在另一个函数里,这样把核心算法与输入条件判断确实简化了编程,之前也在某些书上看过,这次是真有体会。
// LeetCode_ReverseLinkedListII.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode *reverseBetween(ListNode *head, int m, int n) {
if(m==n||head==NULL||head->next==NULL)
return head;
ListNode *s=head,*p=s->next,*q=NULL;
int k=n-m;;
if(m==1)
{
while(k>0)
{
s->next = p->next;
p->next = head;
head = p;
p = s->next;
k--;
}
}
else
{
q = p->next;
while(m>2)
{
s = p;
p = q;
q = q->next;
m--;
}
while(k>0)
{
p->next = q->next;
q->next = s->next;
s->next = q;
q = p->next;
k--;
}
}
return head;
}
int _tmain(int argc, _TCHAR* argv[])
{
/*ListNode *a = new ListNode(6);
ListNode *b = new ListNode(5);
ListNode *c = new ListNode(3);
ListNode *d = new ListNode(1); */
ListNode *e = new ListNode(1);
ListNode *f = new ListNode(4);
/*a->next = b;
b->next = c;
c->next = d;
d->next = e; */
e->next = f;
ListNode *rethead=NULL;
rethead = reverseBetween(e,1,2);
ListNode *p = rethead;
while(p!=NULL)
{
cout<<p->val<<" ";
p = p->next;
}
system("pause");
return 0;
}