常见链表面试题

xiaoxiao2021-02-28  34

头文件以及定义的节点都在上一篇的单链表功能实现里面有写

逆序打印单链表

递归方式简洁明了

void linklist_reverseprintf(linklist *head) { if(head == NULL) { return;//空链表 } linklist_reverseprint(head->next); printf("[%c|%p]\n",head->data,head); }

不允许遍历链表,在pos之前插入

void swap(linktype *a,linktype *b) { linktype t = *a; *a = *b; *b = t; } void linklist_insertbefore(linklist **head,linklist *pos,linktype value) { if(head == NULL) { return;//非法输入 } if(*head == NULL) { return;//空 } if(*head->next == NULL) { linklist_pushhead(head,value); //如果只有一个元素就调用头插函数 } else { linklist *newnode=creat(value); newnode->next=pos->next; pos->next=newnode; swap(&pos->data,&newnode->data); } }

单链表的逆置

void linklist_nizhi(linklist **head) { if(head == NULL) { return; } if(*head == NULL) { return;//空链表 } if(*head->next == NULL) { return *head; } else { linklist *cur = *head; while(cur->next != NULL) { linktype value = cur->next->data; linklist_pop1(head,cur->next); linklist_pushfront(*head,value) } return *head; } }

单链表的冒泡排序

void linklist_bubble(linklist **head) { if(head == NULL) { return;//非法输入 } if(*head == NULL) { return;//空 } else { linklist *cur = *head; linklist *tail = NULL; linklist *pos = *head; for(;cur->next != NULL;cur=cur->next) { for(;pos->next!=tail;pos=pos->next) { if(pos->data>pos->next->data) { swap(&pos->data,&pos->next->data) } } tail = pos; } } }

将两个链表合并为一个有序链表

linklist *linklist_merge(linklist *head1,linklist *head2) { if(head1 == NULL) { return head2; } if(head2 == NULL) { return head1; } else { linklist *cur1 = head1; linklist *cur2 = head2; linklist *newhead = NULL; linklist *newtail = NULL; if(cur1->data<cur2->data) { newhead = newtail = cur1 cur1 = cur1->next; } else { newhead = newtail = cur2; cur2 = cur2->next; } while(cur1 != NULL &&cur2 != NULL) { if(cur1->data <= cur2->data) { newtail->next = cur1; newtail = newtail->next; cur1 = cur1->next; } else { newtail->next = cur2; newtail = newtail->next; cur2 = cur2->next; } } if(cur1 == NULL) { newtail->next = cur2; } else { newtail->next = cur1; } return newhead; } }

找到倒数第k个节点

linklist_size(linklist *head) { if(head == NULL) { return;//空 } else { size_t count = 0; linklist *cur = head; while(cur != NULL) { cur = cur->next; count++; } return count; } } linklist *linklist_findlastknode(linklist *head,size_t k) { if(head == NULL) { return NULL;//空 } if(k > linklist_size(head)) { return NULL;//超过了范围 } else { size_t i=linklist_size(head)-k; linklist *cur = head; for(;i>0;i--) { cur = cur->next; } return cur; } }

删除倒数第k个节点

void linklist_eraselastknode(linklist **head,size_t k) { if(*head == NULL) { return;//非法输入 } if(head == NULL) { return;//空 } if(k > linklist_size(head)) { return;//超范围 } else { linklist *pos = linklist_findlastknode(head,k); linklist_erase(head,pos); } }

判断链表是否带环,如果带环则返回入口点

linklist *linklist_getenter(linklist *head) { if(head == NULL) { return; } else { linklist *fast = head; linklist *slow = head; while(fast &&fast->next) { fast = fast->next->next; slow = slow->next; if(fast == slow) { linklist *meet = fast; linklist *cur = head; while(meet != cur) { cur = cur->next; meet = meet->next; } return meet; } } return NULL; } }

判断两个链表是否相交,如果相交就返回交点(不带环)

“` linklist *linklist_iscross(linklist *head1,linklist *head2) { if(head1 == NULL) { return NULL; } if(head2 == NULL) { return NULL; } else { linklist *cur1 = head1; linklist *cur2 = head2; while(cur1 != NULL) { cur1 = cur1->next; } while(cur2 != NULL) { cur2 = cur2->next; } if(cur1 == cur2) { size_t len = 0; len1 = linklist_size(head1); len2 = linklist_size(head2); linklist *pos1 = head1; linklist *pos2 = head2; if(len1-len2) { size_t len = len1-len2; for(;len>0;len–) { pos1 = pos1->next; } } else { size_t len = len2-len1; for(;len>0;len–) { pos2 = pos2->next; } } while (pos1 != pos2) { pos1 = pos1->next; pos2 = pos2->next; } return pos1; } return NULL; } }

转载请注明原文地址: https://www.6miu.com/read-2624666.html

最新回复(0)