シングルリストのいくつかの問題
(1)試行編纂アルゴリズムは率先してシングルチェーン表をその場で逆置する.「その場で」とは補助空間がO(1)であることを意味する.
【解析】
この問題には二つの解法があります.
aヘッドノードを外して、ヘッドセット法でチェーンテーブルを作ると、いわゆる定位置逆置bが順次巡回して針を反転させますが、最後のノードは、両アルゴリズムの時間の複雑さはO(n)で、空間はすべてO(1)です.
【アルゴリズム】
最初のアルゴリズム:
【解析】
この問題には二つの解法があります.
aヘッドノードを外して、ヘッドセット法でチェーンテーブルを作ると、いわゆる定位置逆置bが順次巡回して針を反転させますが、最後のノードは、両アルゴリズムの時間の複雑さはO(n)で、空間はすべてO(1)です.
【アルゴリズム】
最初のアルゴリズム:
//
int LinkListRerverse(LinkList *head){
LinkList *q,*p;
p = head->next;
head->next = NULL;
while(p != NULL){
q = p->next;
p->next = head->next;
head->next = p;
p = q;
}
return 0;
}
完全な例:#include<stdio.h>
#include<malloc.h>
typedef struct Node
{
int data;
struct Node *next;
}LinkList;
//
int LinkListRerverse(LinkList *head){
LinkList *q,*p;
p = head->next;
head->next = NULL;
while(p != NULL){
q = p->next;
p->next = head->next;
head->next = p;
p = q;
}
return 0;
}
//
int LinkListPrintf(LinkList *head){
LinkList *p;
p = head;
while(p->next){
p = p->next;
printf("%d ",p->data);
}
printf("
");
return 0;
}
//
int LinkListCreate(LinkList *head,int n){
LinkList *p,*newNode;
head->next = NULL;
p = head;
//
for(int i = 0;i < n;i++){
//
newNode = (LinkList*)malloc(sizeof(LinkList));
scanf("%d",&newNode->data);
newNode->next = p->next;
p->next = newNode;
p = newNode;
}
return 0;
}
int main()
{
int n;
while(scanf("%d",&n) != EOF){
LinkList *head;
head = (LinkList*)malloc(sizeof(LinkList));
// (n )
LinkListCreate(head,n);
//
LinkListPrintf(head);
//
LinkListRerverse(head);
//
LinkListPrintf(head);
}
return 0;
}