链表基础题②

225 阅读1分钟

这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战

链表基础题(主要思路)

8.寻找两个链表的公共结点

##思路:先让腿长的人先跑前面的差程,然后和腿短的人一起跑,一起寻找交叉点

LinkList SearchList(LinkList L1,LinkList L2){
	int len1 = Length(L1);
	int len2 = Length(L2);
	int dist;
	LinkList longLis,shortList;		//指向较长和较短的链表
	if(len1 > len2){	//L1长
		longLis = L1->next;
		shortList = L2->next;
		dist = len1 - len2;
	}else{
		longLis = L2->next;
		shortList = L1->next;
		dist = len2 - len1;
	}
	
	while(dist--){
		longLis = longLis->next;	//先让腿长的先跑
	}
	
	while(longLis != NULL){
		if(longLis == shortList)	return longLis;
		else{			//寻找那个同时跑的 起跑线
			longLis = longLis->next;
			shortList = shortList->next;
		}
	}
	return NULL;
	
}

9.升序输出链表

思路:每次找m最小值,从而输出再释放结点

图片.png

10.将题中链表分为序号奇偶两个链表

思路:设两个指针分别指向新的两个链表

LinkList DisCreat(LinkList &A){
	int i = 0;
	B = (LinkList)malloc(sizeof(LNode));
	B->next = NULL;		//B表初始化
	LNode *ra = A,*rb = B;		//分别指向AB两表
	
	p = A->next;		//p为工作指针
	A->next = NULL;
	
	while(p != NULL){
		i++;
		if(i&2 == 0){			//序号为偶
			rb->next = p;		//插入rb表
			rb = p;			//指向新的尾节点
		}else{					//序号为奇
			ra->next = p;
			ra = p;
		}
		p = p->next;	//p 往前走
	}
	ra->next = NULL;
	rb->next = NULL;
	return B;
}

11.将{a,b,a,b...}拆成{a,a,a..},{b,b,b...}

思路:与10题思路一样,只不过改成头插法(题目要求)

图片.png

12.删除递增表的重复元素

思路:工作指针和后继节点相同时则删除

图片.png