閱讀196 返回首頁    go 阿裏雲 go 技術社區[雲棲]


單鏈表的若幹問題

(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

  上一篇:go poj 3167 Cow Bowling【dp】
  下一篇:go 獻給寫作者的完美工具介紹!