链表常见面试题
来源:互联网 发布:牛奶推荐 知乎 编辑:程序博客网 时间:2024/06/06 06:42
#include <iostream>using namespace std;#include <stack>struct listNode {int data;listNode *next;};void insert(listNode **head, int value)//插入{listNode *node = new listNode;node->next = NULL;node->data = value;if (*head == NULL){*head = node;}else{listNode *p = *head;while (p->next != NULL)//不能用(因为p这个地址只是一个副本)while(p!=NULL)p=p->next;p=node;p = p->next;p->next = node;}}void insert1(listNode *&head,int value){listNode *node = new listNode;node->next = NULL;node->data = value;if (head == NULL){head = node;}else{listNode *p = head;while (p->next != NULL) p = p->next;p->next = node;}}void del(listNode **head, int value)//删除{listNode *p = *head;listNode *pre=NULL;while (p != NULL && p->data != value){pre = p;p = p->next;}if (p != NULL){if (*head == p){*head = p->next;delete p;}else{pre->next = p->next;delete p;}}}void print(listNode *head){listNode *p = head;while (p != NULL){cout << p->data << endl;p = p->next;}}//判断是否为循环链表(快慢指针)bool isLoop(listNode *head){bool result = false;listNode *fast = head->next;listNode *slow = head;while (fast != NULL && slow != NULL){if (fast == slow){result = true;break;}fast = fast->next->next;slow = slow->next;}return result;}//在环中寻找一个结点listNode* meetingNode(listNode *head){listNode *fast = head->next;listNode *slow = head;while (fast != NULL && slow != NULL){if (fast == slow){return fast;}fast = fast->next->next;slow = slow->next;}return NULL;}//计算环的大小int count(listNode *head){listNode *pnode = head;int count = 1;pnode=pnode->next;while (pnode != head){count++;pnode = pnode->next;}cout << count << endl;return count;}//找到环形链接的入口listNode *findEnter(listNode *head){int num ;listNode *meeting = meetingNode(head);num = count(meeting);listNode *p1 = head, *p2 = head;for (int i = 0; i < num; i++) p1 = p1->next;while (p1 != p2){p1 = p1->next;p2 = p2->next;}return p1;}//删除相同的结点void deleteSame(listNode *&head){listNode *pre = NULL;listNode *pnode = head;while (pnode != NULL){listNode *pnext = pnode->next;bool needDelete = false;if (pnext != NULL && pnode->data == pnext->data)needDelete = true;if (needDelete == false){pre = pnode;pnode = pnext;}else{int value = pnode->data;while (pnode != NULL &&pnode->data == value){pnext = pnode->next;delete pnode;pnode = pnext;}if (pre == NULL){head = pnode;}elsepre->next = pnode;}}}//反转链表void reverse(listNode *&head){listNode *pre = NULL;listNode *pnode = head;listNode *pnext;while (pnode){pnext = pnode->next;pnode->next = pre;pre = pnode;pnode = pnext;}head = pre;}//逆序打印链表void printr(listNode *head){stack<listNode*> mys;listNode *pnode = head;while (pnode != NULL){mys.push(pnode);pnode = pnode->next;}while (!mys.empty()){cout << (mys.top())->data << " ";mys.pop();}}int main(){listNode *head;head = NULL;/*insert(&head, 0);insert(&head, 1);insert(&head, 2);insert(&head, 3);insert(&head, 4);insert(&head, 5);insert(&head, 6);insert(&head,7);insert(&head, 8);insert(&head, 9);*/insert1(head, 0);insert1(head, 2);insert1(head, 3);insert1(head, 3);insert1(head, 4);insert1(head, 4);insert1(head, 5);insert1(head, 6);//deleteSame(head);print(head);cout << endl;/*reverse(head);print(head);*/printr(head);////建立循环链表//listNode *p1 = head;//listNode *p2 = head;//for (int i = 0; i <= 4;i++)//p1 = p1->next;//while (p2->next != NULL)//p2 = p2->next;//p2->next = p1;//cout << "循环链表?" << isLoop(head) << endl;////判断循环链表的入口////listNode *enter = findEnter(head);//cout << enter->data;////system("pause");return 0;}
0 0
- 链表常见面试题
- 链表常见面试题
- 链表常见面试题
- 链表常见面试题
- 常见的链表相关面试题
- 链表基础及常见面试题
- 链表有关的常见面试题
- 链表有关的常见面试题
- 链表有关的常见面试题
- C++实现链表常见面试题
- 常见面试题之链表操作
- 数据结构之链表常见面试题
- 常见C语言面试题之九:链表逆序
- 链表系列之单链表常见面试题
- 链表常见面试题一:基本问题
- 链表常见面试题二:约瑟夫环
- LeetCode链表操作常见面试题汇总
- 有关链表的一些常见面试题
- android.widget.FrameLayout cannot be cast to android.widget.Button 问题
- Mac下Apktool的配置与应用
- 虚函数与多态
- Median of Two Sorted Arrays(hard)
- HTML5中input背景提示文字(placeholder)的CSS美化
- 链表常见面试题
- JAVAweb开发技术-------(三)JSP (封装自己的标签库)
- SharedPreferences存储图片对象与获取
- 从git仓库中下载项目到Studio中
- 求连续子数组的最大和---2017滴滴笔试编程1
- 转:npm 模块安装机制简介
- runtime从入门到精通(五)—— 消息发送和消息转发
- 快速全球索引-百万数据源测试
- ACM新的篇章