C++实现链表常见面试题-创新互联
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; };
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章名称:C++实现链表常见面试题-创新互联
链接分享:http://azwzsj.com/article/djogsp.html