链表常见面试题

来源:互联网 发布:牛奶推荐 知乎 编辑:程序博客网 时间: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
原创粉丝点击