题目描述如下:
该程序最关键的地方在于reverse函数,这里使用了两种实现方式,分别采用了数组(reverse())及指针(reverse2())的方式,具体实现代码如下。
#include <iostream>
using namespace std;
struct List
{
int num;
List *next;
};
List *head;
// 数组实现,时间复杂度和空间复杂度都为O(n)
void reverse(int begin, int end, List *&head)
{
//在这个函数中编写你的代码
if (begin <= end && begin < 10 && end < 10) {
int i = end - begin + 1;
//int* arr = (int*)malloc(i * sizeof(int));
int *arr = new int[i];//动态定义数组
List *p = head, *q;
for (int j = 0; j < begin; j++)
p = p->next;
q = p;
for (int j = 0; j < i; j++) {//复制
arr[j] = p->num;
p = p->next;
}
for (int j = i - 1; j > -1; j--) {
q->num = arr[j];
q = q->next;
}
}
}
// 指针实现,时间复杂度为O(n),空间复杂度为O(1)
void reverse2(int begin, int end , List *& head) {
if (begin <= end && begin < 10 && end < 10) {
List *p = head, *q, *r, *s, *t;
for (int i = 1; i < begin; i++)
p = p->next;
q = p;
r = q->next;
t = r;
s = r->next;
// 修改指针,转置
for (int i = 0; i <= end-begin; i++) {
r->next = q;
q = r;
r = s;
s = s->next;
}
p->next = q;
t->next = r;
}
}
List *Create()
{
List *p = NULL;
List *q = NULL;
head = NULL;
for ( int i = 0; i < 10; i++ ) {
p = new List;
p->num = i * 2;
if ( head == NULL ) {
head = p;
}
else {
q->next = p;
}
q = p;
}
if ( head != NULL ) {
q->next = NULL;
}
return head;
}
void displayList(List *head)
{
while ( head != NULL ) {
cout << head->num;
head = head->next;
if ( head != NULL ) {
cout << "->";
}
}
cout << endl;
}
int main() {
Create();
int begin, end;
cin >> begin >> end;
reverse(begin, end, head);
displayList(head);
return 0;
}
关于整个链表的逆置可参考:
http://blog.csdn.net/thefutureisour/article/details/8193036