(1).试编写算法将带头结点单链表就地逆置,所谓“就地”是指辅助空间为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("\n");
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;
}