几个链表面试体(从尾逆序打印,删除某个位置,赋值复杂链表)
来源:互联网 发布:阿里云怎么使用 编辑:程序博客网 时间:2024/06/06 16:36
一、程序
#include<iostream>#include<stack>using namespace std;typedef struct Node{ int data;; Node* next; Node(int x) :data(x) ,next(NULL) {}}Node;typedef struct ComplexNode{ int data; ComplexNode* next; ComplexNode* rodom; //随机域 ComplexNode(int x) :data(x) ,next(NULL) ,rodom(NULL) {}}ComplexNode;//1.从尾到头打印单链表;借助stack,时间复杂度O(1),空间复杂度O(N)void PrintfStratEnd(Node* head){ if (head==NULL)//1.链表为空,不用打印 return ; //2.链表不为空,利用栈的先进后出原则打印 Node* cur=head; stack<Node*> s; while(cur) { s.push(cur); cur=cur->next; } while(!s.empty()) { cout<<(s.top()->data)<<"->"; s.pop(); } cout<<endl;}//1.1从尾到头打印单链表--递归void PrintfEnd1(Node* head){ if (head==NULL) return ; PrintfEnd1(head->next); cout<<head->data<<endl;}//2.删除单链表某个非尾位置的结点void DeletepPos(Node* pos){ if (pos==NULL||pos->next==NULL)//1.如果pos为空或者为最后一个结点,不删除,直接返回 return ; //2.pos不为空且不是尾位置,是一个正确的位置 Node* NextNext=pos->next->next;//记录该位置的下下位置 pos->data=pos->next->data;//将该位置和下一位置的值进行交换 delete pos->next;//释放下一个位置的内存 pos->next=NextNext;//将该位置连接到下下位置中}//3.复杂链表的复制ComplexNode* CopyComplexList(ComplexNode* head){ if (head==NULL) return NULL; ComplexNode* cur=head; ComplexNode* NewNode=NULL; //1.复制链表结点并连接到原链表 while(cur) { NewNode=new ComplexNode(cur->data); NewNode->next=cur->next; cur->next=NewNode; cur=NewNode->next; } //2.给新链表结点复制随机值 cur=head; while (cur) { ComplexNode* Node=cur->next; if (cur->rodom) { Node->rodom=cur->rodom->next; } cur=Node->next; } //3.将原链表和新链表分离 cur=head; ComplexNode* NewHead=head->next; while(cur->next->next) { ComplexNode* NewNode=cur->next; cur->next=NewNode->next; cur=NewNode->next; NewNode->next=cur->next; } cur->next=NULL; return NewHead;}void PrintfList(ComplexNode* head){ if (head==NULL) return ; ComplexNode* cur=head; while(cur) { if (cur->rodom) { cout<<cur->data<<"->"<<cur->rodom->data<<endl; } else cout<<cur->data<<endl; cur=cur->next; } cout<<endl;}void Test(){ Node* Node1=new Node(1); Node* Node2=new Node(2); Node* Node3=new Node(3); Node* Node4=new Node(4); Node* Node5=new Node(5); Node* Node6=new Node(6); Node1->next=Node2; Node2->next=Node3; Node3->next=Node4; Node4->next=Node5; Node5->next=Node6; //1.从尾到头打印单链表 cout<<"从尾到头打印单链表"<<endl; PrintfStratEnd(Node1); //2.删除单链表某个非尾位置的结点 cout<<"删除单链表结点4"<<endl; DeletepPos(Node4); PrintfStratEnd(Node1); cout<<"删除单链表结点6"<<endl; DeletepPos(Node6); PrintfStratEnd(Node1); cout<<"删除单链表结点1"<<endl; DeletepPos(Node1); PrintfStratEnd(Node1); ComplexNode* Node11=new ComplexNode(1); ComplexNode* Node22=new ComplexNode(2); ComplexNode* Node33=new ComplexNode(3); ComplexNode* Node44=new ComplexNode(4); ComplexNode* Node55=new ComplexNode(5); ComplexNode* Node66=new ComplexNode(6); Node11->next=Node22; Node22->next=Node33; Node33->next=Node44; Node44->next=Node55; Node55->next=Node66; Node11->rodom=Node33; Node22->rodom=Node55; Node44->rodom=Node66; Node66->rodom=Node66; ComplexNode* NewHead=CopyComplexList(Node11); cout<<"拷贝之后新的链表"<<endl; PrintfList(NewHead); cout<<"拷贝之后原来的链表"<<endl; PrintfList(Node11);}int main(){ Test(); return 0;}
结果:
END!!!
阅读全文
0 0
- 几个链表面试体(从尾逆序打印,删除某个位置,赋值复杂链表)
- 链表面试题(一):逆序打印链表、无头链表删除插入节点、约瑟夫环、逆置单链表
- 链表面试题逆序打印,删除无头非尾节点,非头位置插入,约瑟夫环,查找中间和倒数第k个节点
- 剑指offer--1.删除链表中某个节点 2.从尾到头打印链表
- 链表面试题--从尾到头打印单链表
- 单链表面试题之从尾到头打印单链表
- 链表面试题--从尾到头打印单链表
- 链表面试题--两种方法逆序打印单链表(栈和递归)
- 链表面试题(进阶)&&复杂链表的复制
- day05删除一个无头单链表的非尾节点 +从尾到头打印单链表+复杂链表的复制
- 单链表面试(二)复杂链表的拷贝
- 【链表面试题】删除无头单链表的非尾节点,插入一个元素到无头链表指定位置
- 逆序打印链表
- 逆序打印链表
- 逆序打印链表
- 链表的创建,删除,插入,逆序,打印
- 复杂链表的赋值
- 复杂链表的赋值
- 水题:HDU1303-Doubles
- linux基本命令操作-文件
- CNNs 可视化
- 资源分享:HFOI2017暑假校内赛STD 2017.7.9-2017.7.15
- 3929. 【NOIP2014模拟11.6】创世纪
- 几个链表面试体(从尾逆序打印,删除某个位置,赋值复杂链表)
- 【知识】组合数学
- rvest包爬取猎聘网招聘信息
- hdu 1039 Easier Done Than Said?(字符串模拟)
- lua调用C函数
- C++ vector的初始化、添加、遍历、插入、删除、查找、排序、释放操作
- linux 安装anaconda 使用国内镜像
- JDK的环境变量配置
- jzoj3927【NOIP2014模拟11.6】可见点数(欧拉函数)