链表的相关面试题

Linklits.h
typedef int DataType;
typedef struct Node
{
	DataType _data;
	struct Node* next;
}Node,*pNode,*pList;
void InitLinkList(pList* pplist)//链表初始化
pNode newNode(DataType data)//创建新节点
void PushBack(pList* pplist,DataType data)//尾插
void Popback(pList* pplist)//尾删
void PushFront(pList* pplist,DataType data)//头插
void PopFront(pList* pplist)//头删
pNode Find(pList plist,DataType data)//查找某元素的节点
void EraseNotTail(pNode pos)//删出无头节点的非尾节点
void InserFrontNode(pNode pos,DataType data)//无头链表的的非头节点插入一个元素  
void ReversePrint(pList plist)//逆序打印单链表
void ErasekNode(pList plist,int k)//删除倒数第K个节点(要求只遍历一边)
void BubbleSort(pList* pplist)//冒泡排序
pList Meger(pList pplist1,pList pplist2)//合并两个有序的链表,合并后依然有序。(递归实现)
pNode CheckCircle(pList plist)//检查是否带环
int GetCirclelength(pNode meet)//求环的长度
pNode GetCircleEntry(pList plist,pNode meet)//求环的入口点
int CheckCross(pList plist1,pList plist2)//判断两个链表是否相交
pNode CrossNode(pList plist1,pList plist2)//求交点
#include<iostream>
#include<assert.h>
using namespace std;
typedef int DataType;
typedef struct Node
{
	DataType _data;
	struct Node* next;
}Node,*pNode,*pList;
void InitLinkList(pList* pplist)//链表初始化
{
	assert(pplist);
	*pplist=NULL;
}
pNode newNode(DataType data)//创建新节点
{
	pNode pnode=(Node*)malloc(sizeof(Node));
	if(pnode==NULL)
	{
		perror("Pushbac()::malloc()");//内存分配失败
		exit(1);
	}
	pnode->_data=data;
	pnode->next=NULL;
}
void PushBack(pList* pplist,DataType data)//尾插
{
	pNode pnode=NULL;
	assert(pplist);
	pnode=newNode(data);
	if(*pplist==NULL)
	{
		*pplist=pnode;
	}
	else
	{
		pNode cur=*pplist;
		while(cur->next!=NULL)
		{
			cur=cur->next;
		}
		cur->next=pnode;
	}
}
void Popback(pList* pplist)//尾删
{
	assert(pplist);
	if(*pplist==NULL)
	{
		return ;
	}
	else if((*pplist)->next!=NULL)
	{
		free(*pplist);
		*pplist=NULL;
	}
	else 
	{
		pNode cur=*pplist;
		pNode pre=NULL;
		while(cur->next!=NULL)
		{
			pre=cur;
			cur=cur->next;
		}
		pre->next=NULL;
		free(cur);
	}
}
void PushFront(pList* pplist,DataType data)//头插
{
	pNode pnode=NULL;
	assert(pplist);
	pnode=newNode(data);
	if(*pplist==NULL)
	{
		*pplist=pnode;
	}
	else
	{
		pnode->next=*pplist;
		*pplist=pnode;
	}
}
void PopFront(pList* pplist)//头删
{
	assert(pplist);
	if(*pplist=NULL)
	{
		return ;
	}
	else if((*pplist)->next=NULL)
	{
		free(*pplist);
		*pplist=NULL;
	}
	else
	{
		pNode cur=*pplist;
		*pplist=(*pplist)->next;
		free(cur);
		cur=NULL;
	}
}
pNode Find(pList plist,DataType data)//查找某元素的节点
{
	pNode cur=plist;
	if(plist==NULL)
	{
		return ;
	}
	else
	{   
		while(cur)
		{
			if(cur->_data==data)
			{
				return cur;
			}
			else
			{
				cur=cur->next;
			}
		}
		return NULL;
	}
}
void EraseNotTail(pNode pos)//删出无头节点的非尾节点
{
	pNode cur=NULL;
	if(pos==NULL)
	{
		return ;
	}
	else
	{
		pos->_data=pos->next->_data;
		cur=pos->next;
		pos->next=cur->next;
		free(cur);
	}
}
void InserFrontNode(pNode pos,DataType data)//无头链表的的非头节点插入一个元素  
{
	DataType tmp=0;
	pNode pnode=NULL;
	pnode=newNode(data);
	if(pos==NULL)
	{
		return ;
	}
	else
	{
		pnode->next=pos->next;
		pos->next=pnode;
		tmp=pos->_data;
		pos->_data=pnode->_data;
		pnode->_data=tmp;
	}
}
void ReversePrint(pList plist)//逆序打印单链表
{
	pNode cur=plist;
	if(plist==NULL)
	{
		return ;
	}
	if(cur->next!=NULL)
	{
		ReversePrint(cur->next);
	}
	printf("%d ",cur->_data);
}
void ErasekNode(pList plist,int k)//删除倒数第K个节点(要求只遍历一边)
{
	pNode fast=plist;
	pNode slow=plist;
	pNode cur=NULL;
	while(fast!=NULL&&fast->next!=NULL)
	{
		if(--k<=0)
		{
			cur=slow;
			slow=slow->next;
		}
		fast=fast->next;
	}
	if(slow==plist)
	{
		cur=plist;
		plist=plist->next;
		free(cur);
	}
	else if(k<=0)
	{
		cur->next=slow->next;
		free(slow);
	}
	if(k>1)
	{
		return ;
	}
}










		
		
void BubbleSort(pList* pplist)//冒泡排序
{
	assert(pplist);
	pNode cur=NULL;
	pNode tail=NULL;
	assert(pplist);
	if(*pplist==NULL&&(*pplist)->next==NULL)
	{
		return ;
	}
	else
	{
		while(tail!=(*pplist)->next)
		{
			cur=*pplist;
			while(cur!=tail&&cur->next!=tail)
			{
				if(cur->_data>cur->next->_data)
				{
					DataType tmp=cur->_data;
					cur->_data=cur->next->_data;
					cur->next->_data=tmp;
				}
				cur=cur->next;
			}
			tail=cur;
		}
	}
}
pList Meger(pList pplist1,pList pplist2)//合并两个有序的链表,合并后依然有序。(递归实现)
{
	pList pplist=NULL;
	if(pplist1==NULL)
	{
		return pplist2;
	}
	if(pplist2==NULL)
	{
		return pplist1;
	}
	else
	{
		if(pplist1->_data>pplist2->_data)
		{
			pplist=pplist2;
			pplist->next=Meger(pplist1,pplist2->next);
		}
		else
		{
			pplist=pplist1;
			pplist->next=Meger(pplist1->next,pplist2);
		}
	}
	return pplist;
}
pNode CheckCircle(pList plist)//检查是否带环
{
	pNode fast=plist;
	pNode slow=plist;
	while(fast!=NULL&&fast->next!=NULL)
	{
		slow=slow->next;
		fast=fast->next->next;
		if(fast==slow)
			return fast;
	}
	return NULL;
}
int GetCirclelength(pNode meet)//求环的长度
{
	int i=1;
	pNode cur=meet->next;
	while(cur!=meet)
	{
		cur=cur->next;
		i++;
	}
	return i;
}
pNode GetCircleEntry(pList plist,pNode meet)//求环的入口点
{
	pNode pnode=plist;
	if(pnode==NULL&&meet==NULL)
	{
		return NULL;
	}
	while(pnode!=meet)
	{
		pnode=pnode->next;
		meet=meet->next;
	}
	return meet;
}
int CheckCross(pList plist1,pList plist2)//判断两个链表是否相交
{
	pNode p1=plist1;
	pNode p2=plist2;
	while(p1&&p1->next)
	{
		p1=p1->next;
	}
	while(p2&&p2->next)
	{
		p2=p2->next;
	}
	if((p1==p2)&&(p1!=NULL))
		return 1;
	else
		return -1;
}
pNode CrossNode(pList plist1,pList plist2)//求交点
{
	pList p1=plist1;
	pList p2=plist2;
	int len1=1;
	int len2=1;
	int ret=CheckCross(plist1,plist2);
	if(ret==-1)
	{
		return NULL;
	}
	else{
    
	while(p1->next)
	{
		p1=p1->next;
		len1++;
	}
	while(p2->next)
	{
		p2=p2->next;
		len2++;
	}
	int len=0;
	if(len1>len2)
	{
		 len=len1-len2;
		 p1=plist1;
		 p2=plist2;
		 while(p1&&p1->next)
		 {
			 if(--len<=0)
			 {
				 p2=p2->next;
			 }
			 p1=p1->next;
		 }
		 return p2;


	}
	else
	{
		len=len2-len1;
		 p1=plist1;
		 p2=plist2;
		 while(p2&&p2->next)
		 {
			 if(--len<=0)
			 {
				 p1=p1->next;
			 }
			 p2=p2->next;
		 }
		 return p1;
	}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值