1. 程式人生 > >C語言連結串列的5種常見操作

C語言連結串列的5種常見操作

C語言連結串列的5種常見操作

Ref

typedef struct list{
	int item;
	struct list* next;
}myList

單鏈表反轉


myList* invList(myList* head){
	if(head == null) return null;
	
	myList* prev = null, * next = null;
	while
(head){ next = head->next; head->next = prev; prev = head; heady = next; } return head; }

連結串列中環的檢測

int hasCycle(myList* head){
	myList* fast = head;
	myList* low = head;

	while(fast != NULL && fast->next != NULL){
		low = low->next;
		fast = fast->next->next;
if (low == fast){ return 1; } } return 0; }

兩個有序的連結串列合併

myList* mergeList(myList* li1, myList* li2){
	myList head = {0};
	myList* pRes = &head;

	while(1){
		if(li1 == NULL){
			pRes->next = li2;
		}

		if (li2 == NULL){
			pRes->next = li1;
		}

		if(li1->item < li2->
item){ pRes->next = li1; li1 = li1->next; }else{ pRes->next = li2; li2 = li2->next; } pRes = pRes->next; } return head; }

刪除連結串列倒數第n個結點

myList* removeNthFromEnd(myList* head,int n){
	myList* fast = head;
	myList* prev = NULL;
	myList* next = head;
	int k = n;
	
	/*快指標往後移動k-1*/
	while((k > 1) && (fast != NULL)){
		fast = fast->next;
		k--;
	}
	
	/*說明連結串列數目不足n個*/
	if (fast == NULL){
		return head;
	}
	
	/*快指標移動至最後時,prev到達倒數第n個*/
	while (fast->next != NULL){
		fast = fast->next;
		prev = next;
		next = next->next;
	}

	
	if(prev == NULL){
		//倒數第n個為第一個
		head = head->next;
	}else{
		prev->next = prev->next->next;
	}

	return head;
}

求連結串列的中間結點

myList* middleNode(myList* head)
{
	myList* fast = head;
	myList* low = head;

	while(fast != NULL && fast->next != NULL)
	{
		low = low->next;
		fast = fast->next->next;
	}

	return low;
}