• LeetCode·707.设计链表·架构题


    链接:https://leetcode.cn/problems/design-linked-list/solution/xu-by-xun-ge-v-l7kr/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 

    题目

     

    示例

     

    思路

    解题思路
    设计链表并实现基本功能应该是入门数据结构的基础吧
    简单链表需要实现的四大基本功能:

    1. //将值为 val 的节点追加到链表的index位置
    2. void myLinkedListAddAtMid(MyLinkedList* obj, int index, int val)
    3. {
    4.     obj->len++;
    5.     while(index--)
    6.     {
    7.         obj = obj->next;
    8.     }
    9.     MyLinkedList * n = malloc(sizeof(MyLinkedList));
    10.     n->val = val;
    11.     n->next = obj->next;
    12.     obj->next = n;
    13.     return;
    14. }
    1. //如果索引 index 有效,则删除链表中的第 index 个节点。
    2. void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
    3.     if(obj->len > index)
    4.     {
    5.         obj->len--;
    6.         while(index--)
    7.         {
    8.             obj = obj->next;
    9.         }
    10.         MyLinkedList * n = obj->next;
    11.         obj->next = obj->next->next;
    12.         free(n);
    13.     }
    14.     return;
    15. }
    1. //修改 index 节点的值为 val
    2. void myLinkedList(MyLinkedList* obj, int index, int val)
    3. {
    4.     while(index--)
    5.     {
    6.         obj = obj->next;
    7.     }
    8.     obj->next->val = val;
    9.     return;
    10. }

    1. //获取链表中第 index 个节点的值。如果索引无效,则返回-1。
    2. int myLinkedListGet(MyLinkedList* obj, int index) {
    3.    if(obj->len > index)
    4.    {
    5.        while(index--)
    6.        {
    7.            obj = obj->next;
    8.        }
    9.        return obj->next->val;
    10.    }
    11.    return -1;
    12. }


    对于本题并没有让我们实现改,其实也可以实现一下,毕竟这个也是基本功能

    代码

    1. typedef struct MyLinkedList{
    2. int val;
    3. int len;
    4. struct MyLinkedList * next;
    5. } MyLinkedList;
    6. //打印链表值
    7. void my_printf(MyLinkedList * obj)
    8. {
    9. while(obj->next)
    10. {
    11. printf("%d ", obj->next->val);
    12. obj = obj->next;
    13. }
    14. printf("\n");
    15. return;
    16. }
    17. //初始化
    18. MyLinkedList* myLinkedListCreate() {
    19. MyLinkedList * obj = malloc(sizeof(MyLinkedList));
    20. obj->len = 0;
    21. obj->next = NULL;
    22. return obj;
    23. }
    24. //修改 index 节点的值为 val
    25. void myLinkedList(MyLinkedList* obj, int index, int val)
    26. {
    27. while(index--)
    28. {
    29. obj = obj->next;
    30. }
    31. obj->next->val = val;
    32. return;
    33. }
    34. //获取链表中第 index 个节点的值。如果索引无效,则返回-1。
    35. int myLinkedListGet(MyLinkedList* obj, int index) {
    36. if(obj->len > index)
    37. {
    38. while(index--)
    39. {
    40. obj = obj->next;
    41. }
    42. return obj->next->val;
    43. }
    44. return -1;
    45. }
    46. //在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点
    47. void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
    48. obj->len++;
    49. MyLinkedList * node = malloc(sizeof(MyLinkedList));
    50. node->val = val;
    51. node->next = obj->next;
    52. obj->next = node;
    53. return;
    54. }
    55. //将值为 val 的节点追加到链表的最后一个元素
    56. void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
    57. MyLinkedList * node = malloc(sizeof(MyLinkedList));
    58. obj->len++;
    59. node->val = val;
    60. node->next = NULL;
    61. while(obj->next)
    62. {
    63. obj = obj->next;
    64. }
    65. obj->next = node;
    66. return;
    67. }
    68. //将值为 val 的节点追加到链表的index位置
    69. void myLinkedListAddAtMid(MyLinkedList* obj, int index, int val)
    70. {
    71. obj->len++;
    72. while(index--)
    73. {
    74. obj = obj->next;
    75. }
    76. MyLinkedList * n = malloc(sizeof(MyLinkedList));
    77. n->val = val;
    78. n->next = obj->next;
    79. obj->next = n;
    80. return;
    81. }
    82. //在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
    83. void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
    84. if(index == obj->len)
    85. {
    86. myLinkedListAddAtTail(obj, val);
    87. }
    88. else if(index < 0)
    89. {
    90. myLinkedListAddAtHead(obj, val);
    91. }
    92. else if(index < obj->len)
    93. {
    94. myLinkedListAddAtMid(obj, index, val);
    95. }
    96. return;
    97. }
    98. //如果索引 index 有效,则删除链表中的第 index 个节点。
    99. void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
    100. if(obj->len > index)
    101. {
    102. obj->len--;
    103. while(index--)
    104. {
    105. obj = obj->next;
    106. }
    107. MyLinkedList * n = obj->next;
    108. obj->next = obj->next->next;
    109. free(n);
    110. }
    111. return;
    112. }
    113. //销毁链表
    114. void myLinkedListFree(MyLinkedList* obj) {
    115. while(obj)
    116. {
    117. MyLinkedList * n = obj;
    118. obj = obj->next;
    119. free(n);
    120. }
    121. return;
    122. }
    123. /**
    124. * Your MyLinkedList struct will be instantiated and called as such:
    125. * MyLinkedList* obj = myLinkedListCreate();
    126. * int param_1 = myLinkedListGet(obj, index);
    127. * myLinkedListAddAtHead(obj, val);
    128. * myLinkedListAddAtTail(obj, val);
    129. * myLinkedListAddAtIndex(obj, index, val);
    130. * myLinkedListDeleteAtIndex(obj, index);
    131. * myLinkedListFree(obj);
    132. */
    133. 作者:xun-ge-v
    134. 链接:https://leetcode.cn/problems/design-linked-list/solution/xu-by-xun-ge-v-l7kr/
    135. 来源:力扣(LeetCode)
    136. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    windows远程连接linux并实现上传下载文件,不需要额外安装任何软件~
    单例模式。
    自适应滤波器更新算法-EP2
    窄间距还是PFC方案选择
    广州咖啡加盟怎么开,我有一个梦想,开一家自己咖啡店
    简单对比一下 C 与 Go 两种语言
    博客摘录「 vue中调接口的方式:this.$api、直接调用、axios」2023年11月14日
    Python 提高篇学习笔记(一):深拷贝和浅拷贝
    Vue中引入echarts的步骤
    uniapp-video自定义视频封面
  • 原文地址:https://blog.csdn.net/m0_64560763/article/details/126301287