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;
}

猜你喜欢

转载自blog.csdn.net/sinat_41918479/article/details/85048732