当前位置:   article > 正文

关于链表常用的笔试题总结_链表笔试题总结

链表笔试题总结

一、建立链表

①、头插法建立链表

  1. /**************头插法建立链表*******/
  2. void CreateListF(LinkList *&L,ElemType a[],int n)
  3. {
  4. int i;
  5. L = new LinkList;//注意LinkList()的区别
  6. L->next = NULL;
  7. L->data = n;//带头节点的,保存链表长度
  8. for (i = 0; i < n; i++)
  9. {
  10. LinkList *s = new LinkList;//创建临时节点
  11. s->data = a[i];
  12. s->next = L->next;
  13. L->next = s;
  14. }
  15. }

②、尾插法建立链表

  1. /*************尾插法建立链表************/
  2. void CreateListR(LinkList *&L, ElemType a[], int n)
  3. {
  4. int i;
  5. LinkList *s, *r;
  6. L = new LinkList;
  7. L->data = n;//带头节点的,保存链表长度
  8. r = L;//r一直指向最后
  9. for (i = 0; i < n; i++)
  10. {
  11. s = new LinkList;
  12. s->data = a[i];
  13. r->next =s;
  14. r = s;
  15. }
  16. r->next = NULL;
  17. }

二、反转链表

①、用头插法 

  1. /*带头结点的反转,用头插法的方法*/
  2. void rev1List(LinkList *&L)
  3. {
  4. LinkList *newlist, *cur,*next;
  5. newlist = new LinkList;
  6. newlist->next = NULL;
  7. cur = L->next;
  8. while (cur != NULL)
  9. {
  10. next = cur->next;
  11. cur->next = newlist->next;
  12. newlist->next = cur;
  13. cur = next;
  14. }
  15. L = newlist;
  16. }

②、用指针的方法

  1. /*带头结点的反转,用指针的方法*/
  2. void rev2List(LinkList *&L)
  3. {
  4. if (L == NULL || L->next == NULL)//如果头结点为空或者头结点指向为空,链表长度为0
  5. return;
  6. LinkList *prev, *temp, *next;
  7. prev = NULL;
  8. temp = L->next;//指向第一个实际节点
  9. while (temp->next != NULL)//判断是否遍历完全
  10. {
  11. next = temp->next;
  12. temp->next = prev;//反转
  13. prev = temp;
  14. temp = next;
  15. }
  16. //last node
  17. temp->next = prev;
  18. L->next = temp;//temp是最后一个结点
  19. }

③、递归的方式(不带头节点)

  1. //递归方式,不带头结点的链表,不太适用于带头节点的链表
  2. LinkList *reverseList(LinkList *head)
  3. {
  4. //如果链表为空或者链表中只有一个元素
  5. if (head == NULL || head->next == NULL)
  6. {
  7. return head;
  8. }
  9. else
  10. {
  11. //先反转后面的链表,走到链表的末端结点
  12. LinkList *newhead = reverseList(head->next);
  13. //再将当前节点设置为后面节点的后续节点
  14. head->next->next = head;
  15. head->next = NULL;
  16. return newhead;
  17. }
  18. }

④、本地反转法 

  1. //还有一个本地反转法,begin和end
  2. //参考链接http://c.biancheng.net/view/8105.html

三、查找倒数第K个节点

  1. //查找倒数第k个节点
  2. LinkList *lastNode(LinkList *head, int k)
  3. {
  4. LinkList *first = head;
  5. LinkList *second = head;
  6. for (int i = 0; i < k; i++)
  7. {
  8. first = first->next;
  9. }
  10. while (NULL == first)
  11. {
  12. first = first->next;
  13. second = second->next;
  14. }
  15. }

四、实现两个有序链表的合并

  1. LinkList* mergeTwoLists(LinkList* list1, LinkList* list2){
  2. if (list1 == NULL || list1->next == NULL)
  3. return list2;
  4. if (list2 == NULL || list2->next == NULL)
  5. return list1;
  6. struct LinkList *sp = list1->next;
  7. struct LinkList *prev = list1;
  8. struct LinkList *tmp;
  9. while (sp) {
  10. while (sp->val > list2->next->val){
  11. tmp = list2->next;
  12. list2->next = list2->next->next;//依次删除节点
  13. tmp->next = sp;
  14. prev->next = tmp;
  15. }
  16. prev = sp;
  17. sp = sp->next;
  18. }
  19. if (list2->next != NULL){
  20. prev->next = list2->next;
  21. }
  22. return list1;
  23. }

参考连接:

【链表】链表常见笔试题和面试题(C语言)_c语言链表经典笔试题-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/478380
推荐阅读
相关标签
  

闽ICP备14008679号