成绩 | 5 | 开启时间 | 2021年09月17日 星期五 14:00 |
折扣 | 0.8 | 折扣时间 | 2021年09月30日 星期四 23:59 |
允许迟交 | 否 | 关闭时间 | 2021年10月17日 星期日 23:59 |
请编写函数 void inverse( LinkList ),实现单链表的原地置逆。即利用原来的结点将线性表:L =(a1, a2, …… , an)
变换为:L =( an, …… , a2, a1)
说明:本题目为经典的单链表算法设计题目,简单而有内涵。预设代码中仅用到了C++中的个别东西,但没有采用面向对象的编程方式。
预设代码
前置代码
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */
#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct node
{ ElemType data;
struct node * next;
} NODE;
typedef NODE * LinkList;
void output( LinkList );
void change( int, int, NODE * );
LinkList createList( ElemType );
void inverse( LinkList );
LinkList createList( ElemType finish ) //finish:数据结束标记
{
ElemType x;
NODE *newNode;
LinkList first = new NODE; // 建立头结点
first->next = NULL;
first->data = finish;
cin >> x; // 约定以finish结束连续输入
while ( x != finish )
{
newNode = new NODE; // 建立新结点
newNode->data = x;
newNode->next = first->next; // ①
first->next = newNode; // ②
cin >> x;
}
return first;
}
void output( LinkList head )
{ cout << "List:";
while ( head->next != NULL )
{ cout << head->next->data << ",";
head = head->next;
}
cout << endl;
}
int main(int argc, char** argv)
{
LinkList head;
head = createList( -1 );
output( head );
inverse( head );
output( head );
return 0;
}
/* PRESET CODE END - NEVER TOUCH CODE ABOVE */
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
代码
void inverse(LinkList head){
LinkList p=head->next;
head->next=NULL;
while(p!=NULL){
LinkList q=p->next;
p->next=head->next;
head->next=p;
p=q;
}
}
代码图解
初始状态(L是头结点)
第一步
LinkList p=head->next;
head->next=NULL;
第二步
LinkList q=p->next;
p->next=head->next;
之所以要有这个q指针,是为了不丢失结构体2以及其之后结构体的地址。先用q把2的地址存起来,再让1的next指向别的地方。
第三步
head->next=p;
p=q;
p指向下一个结构体,进入下一轮循环
重复这三步
while(p!=NULL){
LinkList q=p->next;
p->next=head->next;
head->next=p;
p=q;
}
这样看上去很乱,其实就是把原来的L->1->2逆序成了L->2->1,后面的结构体也同理,有兴趣的可以自己画画试试
建议大家不要直接Ctrl+c+v,尽管BIT的编程课对于新手不是很友好,但其实自己多琢磨一会就能想明白