C语言链表类面试题
本文由 太阳城()提供
struct node? {int data;struct node* next;};创建单链表的程序为:struct node* create(unsigned int n){//创建长度为n的单链表assert(n > 0);node* head;head = new node;head->next = NULL;cout << "请输入head节点的值(int型):";cin >> head->data;if (n == 1){?? return head;}node* p = head;for (unsigned int i = 1; i < n; i++){?? node* tmp = new node;?? tmp->next = 0;?? cout << "请输入第" << i+1 << "个节点的值(int):";?? cin >> tmp->data;?? p->next = tmp;?? p = tmp;}return head;}问题1:链表逆置思想为:head指针不断后移,指针反向即可,代码为:void reverse(node*& head){if (head != NULL && head->next != NULL){?? node* p = head;?? node* q = head->next;?? p->next = NULL;?? while (q->next != NULL)?? {??? head = q->next;??? q->next = p;??? p = q;??? q = head;?? }?? head->next = p;}return;}问题2:删除不知头结点链表的某个节点如果单向链表不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?思想为:把这个节点的下一个节点的值复制给该节点,然后删除下一个节点即可。问题3:怎么判断链表中是否有环?思想为:设置两个指针,一个步长为1,另一个步长为2,依次后移,如果相遇且都不为空,则有环。与这个类似的问题包括:怎么快速检测出一个巨大的链表中的死链?或者如何找出一个单链表的中间节点?代码为:bool loop(node* head){bool flag = true;if (head == NULL){?? flag = false;}node* one = head;node* two = head->next;if (two == NULL){?? flag = false;}while (one != two){?? if (one != NULL)?? {??? one = one->next;?? }?? if (two != NULL)?? {??? two = two->next;?? }?? if (two == NULL)?? {??? break;?? }?? two = two->next;?? if (one == NULL || two == NULL)?? {??? break;?? }}if (one == NULL || two == NULL){?? flag = false;}return flag;}问题4:如果一个单向链表,其中有环,怎么找出这个链表循环部分的第一个节点?思想为:假设该节点在x位置处,假设步长为1的指针和步长为2的指针相遇在x+z处,循环的长度为y,那么2(x+z)-(x+z)=k*y,那么当一个指针再从开始出后移时,另一个指针从相遇点开始后移时,这两个指针就会在循环开始处相遇。代码为:node* findLoopPlace(node* head, unsigned int* place = NULL){//查找循环的位置,place存储位置if (!loop(head)){?? return NULL;}node* one = head;node* two = head->next;unsigned int count = 1;while (one != two){??? one = one->next;?? two = two->next->next;}one = head;while (one != two){???? if (count != 1)?? {??? one = one->next;?? }?? two = two->next;?? count++;}*plac
本文详细介绍了C语言中链表的基本操作,包括创建、逆置、删除节点以及判断和查找链表环。创建链表的程序演示了如何初始化一个单链表,链表逆置通过交换节点实现。对于未知头结点的链表,删除节点需要将前一个节点指向当前节点的下一个节点。检测链表环的方法是使用快慢指针,若相遇则存在环。同时,给出了在链表有环的情况下找到循环起点的算法。
2937

被折叠的 条评论
为什么被折叠?



