已知链表头结点指针head,将链表从位置m到n逆序。
这里选取的是2,4两个位置。
#include<stdio.h>
#include<iostream>
using namespace std;
struct ListNode{
int val;
ListNode *next;
ListNode(int x):val(x),next(NULL){}
};
class Solution{
public:
ListNode* reverseBetween(ListNode* head,int m,int n){
int change_len=n-m+1;//一共有多少个数字
//cout<<change_len<<endl;
ListNode* pre_head=NULL;
ListNode* result=head;
//cout<<head->val<<endl;//应该是1
while(head&&--m){
pre_head=head;
head=head->next;
}
ListNode* modify_list_tail=head;//
//cout<<head->val<<endl;//2
ListNode* new_head=NULL;
while(change_len--&&head){//这里是不是涉及边界条件
ListNode* next=head->next;
head->next=new_head;
new_head=head;
head=next;
}
modify_list_tail->next=head;
if(pre_head){
pre_head->next=new_head;
}
else{
result=new_head;
}
return result;
}
};
int main(){
ListNode a(1);
ListNode b(2);
ListNode c(3);
ListNode d(4);
ListNode e(5);
a.next=&b;
b.next=&c;
c.next=&d;
d.next=&e;
e.next=NULL;
//检查链表是否构建成功
ListNode* head=&a;
while(head){
printf("%d\n",head->val);
head=head->next;
}
Solution solve;
head=solve.reverseBetween(&a,2,4);
while(head){
printf("%d\n",head->val);
head=head->next;
}
return 0;
}
结果:
总结:
感觉讲课的老师用的都是class,然后建立一个对象,但是目测acm都是直接方法。
我个人还不知道哪种方式有什么特点,也不知道哪个好。
可能没区别。