当前位置:   article > 正文

经典九道链表OJ题(附详细图解及代码)

oj题

 

 


前言

众所周知,链表是数据结构里面较为重要的。在我们学完链表的时候当然要练练题试试身手,顺便巩固一下知识。话不多说,直接上题~


一.反转链表(难度:简单)力扣.206

d489a6a086ec4a64b2764e0c0bcf2d41.png

思路:结点头插(运用双指针),例如在结点1处依次头插2 3 4 5

图解
504a55fcb6b54191a47a0a60f1b93b61.png
此题比较简单,代码:

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. struct ListNode* reverseList(struct ListNode* head)
  9. {
  10. struct ListNode* newhead = NULL;
  11. struct ListNode* cur = head;
  12. while(cur)
  13. {
  14. struct ListNode* next = cur->next;//用next标记
  15. cur->next = newhead;
  16. newhead = cur;
  17. cur = next;
  18. }
  19. return newhead;
  20. }

二.链表中倒数第k个结点(难度:简单)牛客

20a1dfd072824cec89a9e636e9041398.png

思路:用快慢指针,快的先向前走k步,然后快慢同时走,保证两个指针间隔k
这里需要注意的是一些极端情况,例如链表只有5个结点,要输出倒数第6或者更大的结点,这样就直接返回NULL了。

d551b2cacf7f4b58b272215f7e7f9359.gif

  1. /**
  2. * struct ListNode {
  3. * int val;
  4. * struct ListNode *next;
  5. * };
  6. *
  7. * C语言声明定义全局变量请加上static,防止重复定义
  8. */
  9. struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
  10. {// write code here
  11. struct ListNode* slow = pListHead;
  12. struct ListNode* fast = pListHead;
  13. while(k--)
  14. {
  15. if(fast)
  16. fast = fast->next;
  17. else//考虑假如链表5个数要求倒数第6个结点情况
  18. return NULL;
  19. }
  20. while(fast)
  21. {
  22. slow = slow->next;
  23. fast = fast->next;
  24. }
  25. return slow;
  26. }

三.合并两个有序链表(难度:简单) 力扣.21

1d50d8ff872e48a789528f334d875add.png

思路:新建一个空链表,拿链表1的头开始依次和链表2比大小尾插到新链表

e746ae14bff04355a0d808c08638db59.gif

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
  9. {
  10. if(list1 == NULL)
  11. return list2;
  12. else if(list2 == NULL)
  13. return list1;//防止两个链表为空
  14. struct ListNode *head=NULL; //创空链表
  15. struct ListNode *tail=NULL;
  16. head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));//哨兵位
  17. tail->next = NULL;
  18. while(list1 && list2)
  19. {//依次比大小进行头插
  20. if(list1->val < list2->val)
  21. {
  22. tail->next=list1;
  23. tail = tail->next;
  24. list1 = list1->next;
  25. }
  26. else
  27. {
  28. tail->next=list2;
  29. tail = tail->next;
  30. list2 = list2->next;
  31. }
  32. }
  33. if(list1)//剩下list1直接把剩下的list1一起插入
  34. tail->next = list1;
  35. else
  36. tail->next = list2;
  37. struct ListNode* list = head->next;
  38. free(head);
  39. return list;
  40. }

四.移除链表元素(难度:简单) 力扣.203

5d827744ff964d989897deae6a20e70f.png

思路:从头节点开始进行元素删除,每删除一个元素,需要重新链接节点
注意:这里要考虑空链表的情况。

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. struct ListNode* removeElements(struct ListNode* head, int val)
  9. {//双指针
  10. struct ListNode* cur = head;
  11. struct ListNode* prev = NULL;
  12. while(cur)
  13. {
  14. if(cur->val == val)//相等的跳过
  15. {
  16. if(cur==head)//如果开头就相等
  17. {//头删
  18. head = cur->next;
  19. free(cur);
  20. cur = head;
  21. }
  22. else
  23. {
  24. prev->next = cur->next;
  25. free(cur);
  26. cur = prev->next;
  27. }
  28. }
  29. else//不相等直接往后走
  30. {
  31. prev = cur;
  32. cur = cur->next;
  33. }
  34. }
  35. return head;
  36. }

好了下面要开始上点难度了,铁汁们 坚持就是胜利!!!

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