zoukankan      html  css  js  c++  java
  • 链表的常用操作

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <stdbool.h>
      4 
      5 typedef struct {
      6     int val;
      7     struct MyLinkedList *next;
      8 } MyLinkedList;
      9 
     10 /** Initialize your data structure here. */
     11 
     12 MyLinkedList* myLinkedListCreate() {
     13     MyLinkedList *result = (MyLinkedList *)malloc(sizeof(MyLinkedList));
     14     result->val = 0;
     15     result->next = NULL;
     16     return result;
     17 }
     18 
     19 /** Get the value of the index-th node in the linked list. If the index is invalid, return -1. */
     20 int myLinkedListGet(MyLinkedList* obj, int index) {
     21     if (index < 0 || index >= obj->val) {
     22         return -1;
     23     }
     24 
     25     while (index >= 0) {
     26         obj = obj->next;
     27         index--;
     28     }
     29 
     30     return obj->val;
     31 }
     32 
     33 /** Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. */
     34 void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
     35     if (obj == NULL) {
     36         return;
     37     }
     38 
     39     obj->val++;
     40     MyLinkedList *temp = (MyLinkedList*)malloc(sizeof(MyLinkedList));
     41     temp->val = val;
     42     temp->next = obj->next;
     43     obj->next = temp;
     44 }
     45 
     46 /** Append a node of value val to the last element of the linked list. */
     47 void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
     48     if (obj == NULL) {
     49         return;
     50     }
     51 
     52     obj->val++;
     53     MyLinkedList *temp = (MyLinkedList*)malloc(sizeof(MyLinkedList));
     54     temp->next = NULL;
     55     temp->val = val;
     56 
     57     while (obj->next != NULL) {
     58         obj = obj->next;
     59     }
     60 
     61     obj->next = temp;
     62 }
     63 
     64 /** Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. */
     65 void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
     66     if (obj == NULL || index < 0 || index > obj->val) {
     67         return;
     68     }
     69 
     70     if (index == obj->val) {
     71         myLinkedListAddAtTail(obj, val);
     72         return;
     73     }
     74 
     75     obj->val++;
     76     MyLinkedList *temp = (MyLinkedList*)malloc(sizeof(MyLinkedList));
     77     temp->val = val;
     78     temp->next = NULL;
     79 
     80     while (index > 0) {
     81         obj = obj->next;
     82         index--;
     83     }
     84 
     85     temp->next = obj->next;
     86     obj->next = temp;
     87 }
     88 
     89 /** Delete the index-th node in the linked list, if the index is valid. */
     90 void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
     91     if (obj == NULL || obj->val == 0 || index < 0 || index + 1 > obj->val) {
     92         return;
     93     }
     94 
     95     obj->val--;
     96     while (index > 0) {
     97         obj = obj->next;
     98         index--;
     99     }
    100 
    101     MyLinkedList *temp = obj->next;
    102     obj->next = temp->next;
    103     free(temp);
    104 }
    105 
    106 void myLinkedListFree(MyLinkedList* obj) {
    107     if (obj->next == NULL) {
    108         free(obj);
    109         return;
    110     }
    111 
    112     myLinkedListFree(obj->next);
    113     obj->next = NULL;
    114     myLinkedListFree(obj);
    115 }
    116 
    117 /**
    118  * Your MyLinkedList struct will be instantiated and called as such:
    119  * MyLinkedList* obj = myLinkedListCreate();
    120  * int param_1 = myLinkedListGet(obj, index);
    121 
    122  * myLinkedListAddAtHead(obj, val);
    123 
    124  * myLinkedListAddAtTail(obj, val);
    125 
    126  * myLinkedListAddAtIndex(obj, index, val);
    127 
    128  * myLinkedListDeleteAtIndex(obj, index);
    129 
    130  * myLinkedListFree(obj);
    131 */
    132 
    133 void show(MyLinkedList *obj)
    134 {
    135     while (obj != NULL) {
    136         printf("%d ", obj->val);
    137         obj = obj->next;
    138     }
    139     printf("
    ");
    140 }
    141 
    142 int main()
    143 {
    144     MyLinkedList *obj = NULL;
    145     obj = myLinkedListCreate();
    146     myLinkedListAddAtHead(obj, 1);
    147     show(obj);
    148     myLinkedListAddAtTail(obj, 2);
    149     show(obj);
    150     myLinkedListAddAtIndex(obj, 0, 3);
    151     show(obj);
    152     myLinkedListAddAtIndex(obj, 2, 4);
    153     show(obj);
    154     myLinkedListDeleteAtIndex(obj, 0);
    155     show(obj);
    156     myLinkedListDeleteAtIndex(obj, 2);
    157     show(obj);
    158 //    myLinkedListFree(obj);
    159 
    160     return 0;
    161 }

    题目来源:LeetCode707

  • 相关阅读:
    eclipse卡死在search for main types 20 files to index
    多线程并发执行任务,取结果归集。终极总结:Future、FutureTask、CompletionService、CompletableFuture
    同步中的四种锁synchronized、ReentrantLock、ReentrantReadWriteLock、StampedLock
    根据CPU核心数确定线程池并发线程数
    将DataTable转换成CSV文件
    C#中DataTable转化为List<T>解析
    DotNet项目中的一些常用验证操作
    DotNet处理服务器路径的方法
    C#运用ThoughtWorks生成二维码
    C#枚举类型的常用操作总结
  • 原文地址:https://www.cnblogs.com/hemeiwolong/p/12893694.html
Copyright © 2011-2022 走看看