Data Structure--单链表相关例题(2)

单链表

具体接上一篇博客

1.找出两个单链表的起始节点

对于这个种题目,我们就还是用两个指针,先对两个单链表进行循环遍历,然后再计算出之间的差值,在将长的那个指针先开始遍历多余的部分,然后再长短指针进行同事的遍历,再将其输出就可以了.

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
	int lenA = 0, lenB = 0;
	struct ListNode* curA = headA;	//初始定义
	struct ListNode* curB = headB;
	while (curA){		//循环求长

		++lenA;
		curA = curA->next;
	}
	while (curB){		//循环求长

		++lenB;
		curB = curB->next;
	}

	int gap = abs(lenA - lenB);

	struct ListNode* longList = headA, *shortList = headB;	//分别指向头结点
	if (lenB>lenA){		//选择语句,对长的进行遍历

		longList = headB;
		shortList = headA;
	}
	while (gap--){		//先对长的指向到对应的位置

		longList = longList->next;
	}
	while (longList&&shortList){		//捆绑循环

		if (longList == shortList)
			return longList;			//找到相等则返回
		
		longList = longList->next;		//继续循环
		shortList = shortList->next;
	}
	return NULL;		//找不到返回空
}

2.给定一个链表,返回链表入环的节点。 若无环,则返回 NULL

我们这样理解,定义两个指针,第一个指针比第二个快一个,进行循环遍历,因为是环状的,所以他们总会遇到,由此,就证明遇到了,反之则没有,当找到以后我们又可以进行循环,找到最初开始的那个节点.

struct ListNode* listCycle(struct ListNode* head){

	struct ListNode* fast = head;		//两个节点
	struct ListNode* slow = head;
	
	while (fast&&fast->next){		//指针捆绑循环

		fast = fast->next->next;
		slow = slow->next;			//循环
		
		if (fast == slow)			//当出现相等返回fast
			return fast;
	}
	return NULL;		//不是循环则返回空
}

bool hasCycle(struct ListNode *head) {

	struct ListNode* node = listCycle(head);		//调用
	if (node){		//存在时
		while (node){	//进行循环
	
			if (node == head)			//当找到开始节点时,返回值
				return node;
			node = node->next;			//未找到继续循环
			head = head->next;
		}
	}
	return NULL;		//没有则返回空
}

3.对链表进行插入排序

创建了多个节点,插入排序也就是先改变连线的方向,再进行头插即可,注意排序

struct ListNode* insertionSortList(struct ListNode* head){
	//从前向后进行遍历
	//if(head==NULL||head->head==NULL)
	//    return head;

	struct ListNode* tail, *cur, *prev, *node;
	
	tail = head;
	cur = head->next;
	while (cur){

		if (cur->val<tail->val){

			//头结点开始遍历
			prev == NULL;
			node = head;
			while (node && node->val <= cur->val){

				prev = node;
				node = node->next;
			}
			tail->next = cur->next;
			cur->next = node;
			if (prev)
				prev->next = cur; 
			else
				head = cur;
			cur = tail->next;
		}
		else{

			tail = tail->next;
			cur = tail->next;
		}

	}
	return head;
}

还是对单链表的理解,明天将双向链表,大家一起加油!!!多敲代码!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值