代码随想录一刷——707.设计链表

使用虚拟节点法进行链表的设计

1.在操作过程中一定要注意边界条件,否则代码通过不了,比如对链表尾部进行操作的时候

2.注意在内存的申请

编程实现

C++:

class MyLinkedList {

public:

    //定义链表结构体

    struct LinkNode

    {

        int val;

        LinkNode* next;

        LinkNode(int val):val(val), next(nullptr){}

    };

    //构造函数

    MyLinkedList()

    {

        size = 0;

        dummyHead = new LinkNode(0);

    }

   

    //获取链表中下标为index的节点的值

    int get(int index)

    {

        if(index > (size - 1) || index < 0)

            return -1;

        LinkNode* cur = dummyHead->next;

        while(index--)

        {

            cur = cur->next;

        }

        return cur->val;

    }

   

    //将一个值为val的节点插入到链表中的第一个元素之前

    void addAtHead(int val)

    {

        LinkNode* newnode = new LinkNode(val);

        newnode->next = dummyHead->next;

        dummyHead->next = newnode;

        size++;

    }

   

    //将一个值为val的节点追加到链表中作为链表的最后一个元素

    void addAtTail(int val)

    {

        LinkNode* newnode = new LinkNode(val);

        LinkNode* cur = dummyHead;

        while(cur->next != nullptr)

        {

            cur = cur->next;

        }

        cur->next = newnode;

        //newnode->next = nullptr;

        size++;

    }

   

    //将一个值为val的节点插入到链表中下标为index的节点之前。

    void addAtIndex(int index, int val)

    {

        if(index > size) return;

        if(index < 0) index = 0;

        LinkNode* newnode = new LinkNode(val);

        LinkNode* cur = dummyHead;

        while(index--)

        {

            cur = cur->next;

        }

        newnode->next = cur->next;

        cur->next = newnode;

        size++;

    }

   

    void deleteAtIndex(int index)

    {

        if(index > (size - 1) || index < 0) return;

        LinkNode* cur = dummyHead;

        while(index--)

        {

            cur = cur->next;

        }

        LinkNode* tmp = cur->next;

        cur->next = cur->next->next;

        delete tmp;

        tmp = nullptr;

        size--;

    }

    //打印链表

    void printLink()

    {

        LinkNode* cur = dummyHead;

        while(cur->next != nullptr)

        {

            cout << cur->next->val << " ";

            cur = cur->next;

        }

        cout << endl;

    }

private:

    int size;

    LinkNode* dummyHead;

};

C:

typedef struct Node {

    int val;

    struct Node* next;

} Node;


 

typedef struct {

    int size;

    Node* data;

} MyLinkedList;

/** Initialize your data structure here. */

MyLinkedList* myLinkedListCreate() {

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

    Node* head = (Node*)malloc(sizeof(Node));

    head->next = NULL;

    obj->data = head;

    obj->size = 0;

    return obj;

}

/** Get the value of the index-th node in the linked list. If the index is invalid, return -1. */

int myLinkedListGet(MyLinkedList* obj, int index) {

    if (index < 0 || index >= obj->size) return -1;

    Node* cur = obj->data->next;

    while (index--) {

        cur = cur->next;

    }

    return cur->val;

}

/** 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. */

void myLinkedListAddAtHead(MyLinkedList* obj, int val) {

    Node* node = (Node*)malloc(sizeof(Node));

    node->val = val;

    Node* cur = obj->data;

    node->next = cur->next;

    cur->next = node;

    obj->size++;

}

void myLinkedListAddAtTail(MyLinkedList* obj, int val)

{

    Node* node = (Node*)malloc(sizeof(Node));

    node->val = val;

    Node* cur = obj->data;

    while(cur->next != NULL)

    {

        cur = cur->next;

    }

    cur->next = node;

    node->next = NULL;

    obj->size++;

}

void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val)

{

    Node* node = (Node*)malloc(sizeof(Node));

    node->val = val;

    Node* cur = obj->data;

    if(index < 0 || index > obj->size) return;

    else if(index == obj->size) //这种情况是插入到链表的尾端

    {

       

        while(cur->next != NULL)

        {

            cur = cur->next;

        }

        cur->next = node;

        node->next = NULL;

        obj->size++;

    }

    else

    {

        while (index--) {

            cur = cur->next;

        }

        node->next = cur->next;

        cur->next = node;

        obj->size++;

    }

}

void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {

    if(index < 0 || index >= obj->size) return;

    Node* cur = obj->data;

    while(index--)

    {

        cur = cur->next;

    }

    Node* tmp = cur->next;

    cur->next = cur->next->next;

    free(tmp);

    obj->size--;

}

void myLinkedListFree(MyLinkedList* obj) {

    Node* tmp = obj->data;

    while(tmp != NULL)

    {

        Node* n = tmp;

        tmp = tmp->next;

        free(n);

    }

    free(obj);

}

Python:

class LinkNode:

    def __init__(self,val = 0,next = None):

        self.val = val

        self.next = next

class MyLinkedList(object):

    def __init__(self):

        self.dummyHead = LinkNode()

        self.size = 0

    def get(self, index):

        """

        :type index: int

        :rtype: int

        """

        if index < 0 or index >= self.size:

            return -1

        cur = self.dummyHead.next

        for i in range(index):

            cur = cur.next

        return cur.val

       

    def addAtHead(self, val):

        """

        :type val: int

        :rtype: None

        """

        self.dummyHead.next = LinkNode(val,self.dummyHead.next)

        self.size += 1

    def addAtTail(self, val):

        """

        :type val: int

        :rtype: None

        """

        cur = self.dummyHead

        while cur.next:

            cur = cur.next

        cur.next = LinkNode(val)

        self.size += 1

    def addAtIndex(self, index, val):

        """

        :type index: int

        :type val: int

        :rtype: None

        """

        cur = self.dummyHead

        if index < 0 or index > self.size:

            return

        elif index == self.size:

            while cur.next:

                cur = cur.next

            cur.next = LinkNode(val)

        elif index < self.size:

            for i in range(index):

                cur = cur.next

            cur.next = LinkNode(val,cur.next)

        self.size += 1

       

    def deleteAtIndex(self, index):

        """

        :type index: int

        :rtype: None

        """

        if index < 0 or index >= self.size:

            return

        cur = self.dummyHead

        for i in range(index):

            cur = cur.next

        cur.next = cur.next.next

        self.size -= 1

   

    def printLink(self):

        cur = self.dummyHead

        while cur.next:

            print(cur.val)

注意在插入或者删除结点的操作时,n所指向的都是cur->next,我们需要得到的是n-1所对应的也即是cur,这样进行插入删除操作才不会出错。
 

### 关于 KamaCoder 网站的功能与特点 KamaCoder 是个专注于 ACM 模式练习的学习平台,旨在帮助编程爱好者提升算法能力和熟悉常见数据结构的操作[^1]。该网站由知名算法博主代码随想录创建,提供了系列精选的 25 道题目,这些题目覆盖了多种核心知识点,包括但不限于数组、链表、树、图等基础数据结构以及动态规划、贪心算法等多种经典算法。 #### 功能概述 - **多语言支持**:KamaCoder 提供 C++、Java、Python 和 C 四种主流编程语言的支持,允许用户自由选择熟悉的开发环境来解决问题。 - **在线评测系统**:用户可以提交自己的解决方案,并获得即时反馈,查看运行时间、内存消耗以及其他性能指标的结果分析。 - **社区互动**:除了个人练习外,还可以浏览其他用户的解答思路及其优化建议,从而促进交流学习氛围。 此外,未来计划中的卡码笔记将进步扩展其教育价值,成为代码随想录知识星球内的个重要组成部分。它不仅能够满足基本技能训练需求,还将引导学员深入参与到实际项目的建设过程中去——即打造属于他们自己的个性化学习空间,在那里完成技术文档整理和技术面试准备等工作的同时也增强了动手实践的能力[^2]。 对于希望提高自己编码技巧或者备战各类程序设计竞赛的朋友来说,这无疑是个非常值得尝试的好地方! ```python # 示例代码展示如何利用并查集解决路径查找问题 class UnionFind: def __init__(self, n): self.parent = list(range(n)) def find(self, u): if self.parent[u]!=u: self.parent[u]=self.find(self.parent[u]) return self.parent[u] def join(self,u,v): pu,pv=self.find(u),self.find(v) if pu==pv:return False self.parent[pu]=pv return True def isSame(self,u,v): return self.find(u)==self.find(v) uf=UnionFind(10) # 初始化大小为10的并查集实例 print(uf.join(1,2)) # 将节点1和2连接起来 print(uf.isSame(1,2)) # 判断节点1和2是否在同集合中 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值