• 代码随想录算法训练营第三天| LeetCode ● 203.移除链表元素 ● 707.设计链表 ● 206.反转链表


    做题前知识学习:

    循环链表可以用来解决约瑟夫环问题。

    “数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。”对于这个问题我有疑问,因为我考研学习到的说其实数组的内存存放也不是连续的,是由索引查找的,只不过看起来时连续的。有没有大佬解释一下,是因为它电脑设置的查找方式不同导致的吗?

    删除节点:

    在C++里最好是再手动释放这个D节点,释放这块内存。

    其他语言例如Java、Python,就有自己的内存回收机制,就不用自己手动释放了。

    LeetCode ● 203.移除链表元素

    LeetCode ● 203.移除链表元素

    没有考虑到头节点为空的情况,我还以为很简单,这都卡住我了。。。

    1. struct ListNode* removeElements(struct ListNode* head, int val) {
    2. struct ListNode *curr=head->next;
    3. struct ListNode *pre=head;
    4. while(curr){ //错误代码
    5. if(head != NULL && head->val == val){
    6. pre=head=head->next;
    7. }
    8. else if(curr->val == val){
    9. pre->next=curr->next;
    10. }
    11. else if(curr->val != val){
    12. pre=pre->next;
    13. }
    14. curr=curr->next;
    15. }
    16. return head;
    17. }
    1. struct ListNode* removeElements(struct ListNode* head, int val) {
    2. struct ListNode *curr = head;
    3. struct ListNode *pre = NULL;
    4. while (curr != NULL) { //正确代码
    5. if (curr->val == val) {
    6. if (pre == NULL) { // 如果当前节点是头节点
    7. head = curr->next;
    8. } else {
    9. pre->next = curr->next;
    10. }
    11. } else {
    12. pre = curr; // 只有当当前节点不被删除时,才更新 pre
    13. }
    14. curr = curr->next;
    15. }
    16. return head;
    17. }

    LeetCode ● 707.设计链表

    LeetCode ● 707.设计链表

    这题居然都挡住我了。逻辑是简单的,但是就是力扣的提示不太到位,有时候理解不到位。官解居然没有指明一个结构体,其实也还好我自己设置了一个。自己技术有限吧。我今天看了看我这开发都感觉难做,测试吧?大佬求解

    1. typedef struct MyLinkedList{
    2. int val;
    3. struct MyLinkedList *next;
    4. } MyLinkedList;
    5. MyLinkedList* myLinkedListCreate() {
    6. MyLinkedList *obj=(MyLinkedList*)malloc(sizeof(MyLinkedList));
    7. obj->next=NULL;
    8. return obj;
    9. }
    10. int myLinkedListGet(MyLinkedList* obj, int index) {
    11. MyLinkedList *curr=obj->next;
    12. for(int i=0;i<index;i++){
    13. if(curr==NULL){
    14. return -1;
    15. }
    16. curr=curr->next;
    17. }
    18. if(curr){
    19. return curr->val;
    20. }else{
    21. return -1;
    22. }
    23. }
    24. void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
    25. MyLinkedList *temp=(MyLinkedList*)malloc(sizeof(MyLinkedList));
    26. temp->val=val;
    27. temp->next=obj->next;
    28. obj->next=temp;
    29. }
    30. void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
    31. MyLinkedList *curr=obj;
    32. while(curr->next){
    33. curr=curr->next;
    34. }
    35. MyLinkedList *temp=(MyLinkedList*)malloc(sizeof(MyLinkedList));
    36. temp->next=NULL;
    37. temp->val=val;
    38. curr->next=temp;
    39. }
    40. void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
    41. MyLinkedList *curr=obj->next;
    42. MyLinkedList *pre=obj;
    43. for(int i=0;i<index;i++){
    44. if(curr==NULL){
    45. return ;
    46. }
    47. curr=curr->next;
    48. pre=pre->next;
    49. }
    50. if(curr){
    51. MyLinkedList *temp=(MyLinkedList*)malloc(sizeof(MyLinkedList));
    52. temp->val=val;
    53. temp->next=curr;
    54. pre->next=temp;
    55. }else{
    56. MyLinkedList *temp=(MyLinkedList*)malloc(sizeof(MyLinkedList));
    57. temp->val=val;
    58. temp->next=NULL;
    59. pre->next=temp;
    60. }
    61. }
    62. void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
    63. MyLinkedList *curr=obj->next;
    64. MyLinkedList *pre=obj;
    65. for(int i=0;i<index;i++){
    66. if(curr==NULL){
    67. return ;
    68. }
    69. curr=curr->next;
    70. pre=pre->next;
    71. }
    72. if(curr){
    73. pre->next=curr->next;
    74. }
    75. }
    76. void myLinkedListFree(MyLinkedList* obj) {
    77. while(obj != NULL){
    78. MyLinkedList *tmp = obj;
    79. obj = obj->next;
    80. free(tmp);
    81. }
    82. }
    83. /**
    84. * Your MyLinkedList struct will be instantiated and called as such:
    85. * MyLinkedList* obj = myLinkedListCreate();
    86. * int param_1 = myLinkedListGet(obj, index);
    87. * myLinkedListAddAtHead(obj, val);
    88. * myLinkedListAddAtTail(obj, val);
    89. * myLinkedListAddAtIndex(obj, index, val);
    90. * myLinkedListDeleteAtIndex(obj, index);
    91. * myLinkedListFree(obj);
    92. */

    力扣 206.反转链表

    力扣 206.反转链表

    这题还是简单,考研复试做过了。但现在来写还是不会,只知道要有三个指针。具体怎么样写不出来,还得看一下思路,我是不是脑子不好呀,但我又安慰自己你能做出来但只不过没有那么快那么有效率。

    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. struct ListNode *pre=NULL;
    10. struct ListNode *curr=head;
    11. struct ListNode *temp=NULL;//保存下一个位置
    12. while(curr){
    13. temp=curr->next;
    14. curr->next=pre;
    15. pre=curr;
    16. curr=temp;//后移
    17. }
    18. head=pre;
    19. return head;
    20. }

    又完成一天,哈哈,有够差劲的

  • 相关阅读:
    C++之list
    最近身边一个技术负责人裸辞了...
    【移动应用开发期末复习】第五/六章
    C语言的文件操作(文件指针、文件缓冲区、文件的打开、读写操作)
    Java基于SpringBoot的车辆充电桩
    说出你常用的20个linux命令,你还是只会说ls、cat那20个命令吗?3分钟让你发现新大陆
    C语言——写一个函数,每调用一次这个函数,就会将num的值增加1
    springboot最常用的注解们
    antd table 复选框禁选功能
    基于三维GIS开发的水电工程建设方案
  • 原文地址:https://blog.csdn.net/m0_56028924/article/details/139298350