LeetCode 707. 设计链表 【知识点:链表操作集】

题目

设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。

在链表类中实现这些功能:

get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

示例:

MyLinkedList linkedList = new MyLinkedList();
linkedList.addAtHead(1);
linkedList.addAtTail(3);
linkedList.addAtIndex(1,2); //链表变为1-> 2-> 3
linkedList.get(1); //返回2
linkedList.deleteAtIndex(1); //现在链表是1-> 3
linkedList.get(1); //返回3

提示:

所有val值都在 [1, 1000] 之内。
操作次数将在 [1, 1000] 之内。
请不要使用内置的 LinkedList 库。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/design-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

代码

单链表

typedef struct _Node Node;
struct _Node{
    int val;
    Node* next;
};

typedef struct{
    Node* Head;
    Node* Tail;
} MyLinkedList;

MyLinkedList* myLinkedListCreate()
{
    MyLinkedList* obj = (MyLinkedList*)malloc(sizeof(MyLinkedList));

    obj->Head = obj->Tail = (Node*)malloc(sizeof(Node));
    obj->Head->val = 0;  //链表元素个数
    obj->Head->next = NULL;

    return obj;
}

int myLinkedListGet(MyLinkedList* obj, int index) 
{
    if(index >= obj->Head->val) return -1;

    int i = 0;
    Node* p;
    for(p=obj->Head->next;p && i < index;p=p->next,i++);

    return p->val;
}

void myLinkedListAddAtHead(MyLinkedList* obj, int val) 
{
    Node* NewNode = malloc(sizeof(Node));
    NewNode->val = val;
    NewNode->next = obj->Head->next;

    if(obj->Head->next == NULL){

        obj->Tail = NewNode;
    }

    obj->Head->next = NewNode;
    obj->Head->val++;
}

void myLinkedListAddAtTail(MyLinkedList* obj, int val) 
{
    Node* NewNode = malloc(sizeof(Node));
    NewNode->val = val;
    NewNode->next = NULL;

    obj->Tail->next = NewNode;
    obj->Tail = NewNode;
    obj->Head->val++;
}

void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) 
{
    if(index <= obj->Head->val){

        int i;
        Node* p;
        for(p=obj->Head,i=0;p;p=p->next,i++){

            if(index == i){
                Node* NewNode = malloc(sizeof(Node));
                NewNode->val = val;
                NewNode->next = p->next;

                p->next = NewNode;
                obj->Head->val++;

                if(NewNode->next == NULL){
                    obj->Tail = NewNode;
                }

                break;
            }
        }
    }
}

void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) 
{
    if(index < obj->Head->val){

        int i;
        Node* p,*temp;
        for(p=obj->Head,i=0;p;p=p->next,i++){

            if(index == i){
                temp = p->next;
                p->next = temp->next;
                free(temp);

                obj->Head->val--;

                if(p->next == NULL){
                    obj->Tail = p;
                }

                break;
            }
        }
    }
}

void myLinkedListFree(MyLinkedList* obj) 
{
    Node *p,*q;
    for(p=obj->Head->next;p;p=q){

        q = p->next;
        free(p);
    }
}

双链表

typedef struct _Node Node;
struct _Node{
    int val;
    Node* prev;
    Node* next;
};

typedef struct{
    Node* Head;
    Node* Tail;
} MyLinkedList;

MyLinkedList* myLinkedListCreate()
{
    MyLinkedList* obj = (MyLinkedList*)malloc(sizeof(MyLinkedList));

    obj->Head = malloc(sizeof(Node));
    obj->Tail = malloc(sizeof(Node));

    obj->Head->next = obj->Tail;
    obj->Tail->prev = obj->Head;

    obj->Head->val = obj->Tail->val = 0;

    return obj;
}

int myLinkedListGet(MyLinkedList* obj, int index) 
{
    if(index >= obj->Head->val) return -1;

    int i = 0;
    Node* p;
    for(p=obj->Head;i <= index;p=p->next,i++);

    return p->val;
}

void myLinkedListAddAtHead(MyLinkedList* obj, int val) 
{
    Node* NewNode = malloc(sizeof(Node));
    NewNode->val = val;
    NewNode->next = obj->Head->next;
    NewNode->prev = obj->Head;

    obj->Head->next->prev = NewNode;
    obj->Head->next = NewNode;

    obj->Head->val++;
    obj->Tail->val++;
}

void myLinkedListAddAtTail(MyLinkedList* obj, int val) 
{
    Node* NewNode = malloc(sizeof(Node));
    NewNode->val = val;
    NewNode->next = obj->Tail;
    NewNode->prev = obj->Tail->prev;

    obj->Tail->prev->next = NewNode;
    obj->Tail->prev = NewNode;

    obj->Head->val++;
    obj->Tail->val++;
}

void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) 
{
    if(index <= obj->Head->val){

        int i;
        Node* p;
        for(p=obj->Head,i=0;i < index;p=p->next,i++);

        Node* NewNode = malloc(sizeof(Node));
        NewNode->val = val;
        NewNode->next = p->next;
        NewNode->prev = p;

        p->next->prev = NewNode;
        p->next = NewNode;
        
        obj->Head->val++;
        obj->Tail->val++;
    }
}

void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) 
{
    if(index < obj->Head->val){

        int i;
        Node* p,*temp;
        for(p=obj->Head,i=0;i<=index;p=p->next,i++);

        p->next->prev = p->prev;
        p->prev->next = p->next;
        free(p);

        obj->Head->val--;
        obj->Tail->val--;
    }
}

void myLinkedListFree(MyLinkedList* obj) 
{
    Node *p,*q;
    for(p=obj->Head->next;p != obj->Tail;p=q){

        q = p->next;
        free(p);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值