温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++实现链表常见面试题

发布时间:2020-04-14 04:11:38 来源:网络 阅读:284 作者:LOVEMERIGHT 栏目:编程语言

C+实现链表的常见面试题

删除非尾节点:

void SList::EraseNotTail(Node* pos)	{	Node* del=NULL;	pos->_data=pos->_next->_data;	del=pos->_next;	pos->_next=pos->_next->_next;	delete del;	del=NULL;	}

反转(逆序)链表:

void SList::Reverse() {	if(_head==NULL)	return;	if(_head==_tail)	return;	Node* cur=NULL;	Node* prev=NULL;	Node* newnode=NULL;	Node* tmp=_head;	cur=_head;	while(cur)	{	prev=cur;	cur=cur->_next;	prev->_next=newnode;	newnode=prev;	}	_head=newnode;	_tail=tmp; }

排序链表(冒泡):

void SList::BubbleSort() {	Node* cur=_head;	Node* end=NULL;	while(cur!=end)	{	while(cur&&(cur->_next!=end))	{	if(cur->_data>cur->_next->_data)	{	DataType tmp=cur->_data;	cur->_data=cur->_next->_data;	cur->_next->_data=tmp;	}	cur=cur->_next;	}	end=cur;	cur=_head;	} }

在当前节点前插入一个数据x:

void SList::InsertFrontNode(Node* pos, DataType d)	{	Node* newnode=new Node(d);	newnode->_next=pos->_next;	pos->_next=newnode;	DataType tmp=pos->_data;	pos->_data=pos->_next->_data;	pos->_next->_data=tmp;	}

查找链表的中间节点:

Node* SList::FindMidNode() {	Node* fast=_head;	Node* slow=_head;	while(fast&&(fast->_next!=NULL))	{	fast=fast->_next->_next;	slow=slow->_next;	}	return slow; }

删除单链表的倒数第k个节点(k > 1 && k < 链表的总长度):

void SList::DelKNode(int k)	{	Node* list1=_head;	Node* list2=_head;	while(--k)	{	list1=list1->_next;	}	while(list1->_next!=NULL)	{	list1=list1->_next;	list2=list2->_next;	}//list2指向的是倒数第k个节点	Node* del=list2->_next;	list2->_data=del->_data;//将list2后面的数覆盖到list2,删除list2后面的节点	list2->_next=del->_next;	delete del;	}

链表的带环问题:

1.检查链表是否带环,若带环返回相遇点,不带环则返回空

Node* SList::CheckCycle() {	Node* s1=_head;	Node* s2=_head;	while(s1&&(s1->_next!=NULL))	{	s1=s1->_next->_next;	s2=s2->_next;	if(s1==s2)	return s1;	}	return NULL; }

2.求环的长度

int SList::GetCircleLength(Node* meetNode)	{	if(meetNode==NULL)	{	return 0;	}	Node* cur=meetNode;	int count=0;	do	{	cur=cur->_next;	count++;	}while(cur!=meetNode);	return count;	}

3.获取环入口点

Node* SList::GetCycleEntryNode(Node* meetNode)	{	Node* entry=_head;	Node* meet=meetNode;	while(entry!=meet)	{	entry=entry->_next;	meet=meet->_next;	}	return entry;	}

删除链表中指定的数字

void SList::Remove(const DataType& d) {	Node* del=Find(d);	if(del==_head)	{	_head=_head->_next;	delete del;	return;	}	else	{	Node* cur=_head;	while(cur->_next!=del)	{	cur=cur->_next;	}	if(del==_tail)	{	_tail=cur;	}	cur->_next=del->_next;	delete del;	} }

删除链表中所有指定的数字

void SList::RemoveAll(const DataType& d) {	Node* cur=_head;	Node* prev=NULL;	while(cur!=NULL)	{	if(cur->_data==d)	{	if(cur==_head)	{	Node* del=_head;	_head=_head->_next;	cur=_head;//	delete del;	}	else	{	Node* del=cur;	if(cur==_tail)	{	_tail=prev;	}	prev->_next=cur->_next;	cur=prev->_next;//cur指向下一个节点	delete del;	}	}	else	{	prev=cur;	cur=cur->_next;	}	} }

查找指定数字并返回所在位置

Node* SList::Find(const DataType& d) {	Node* cur=_head;	while(cur)	{	if(cur->_data==d)	return cur;	cur=cur->_next;	}	return NULL; }

Node 结构体

struct Node {	Node(const DataType& d)	:_data(d)	,_next(NULL)	{}	DataType _data;	struct Node* _next; };

SList 类

class SList { protected: Node* _head; Node* _tail; };


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI