單鏈表的若幹問題
(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;
}
最後更新:2017-04-03 14:53:41