leetcode 实战篇-链表篇

前言

这是小老弟学习 leetcode 链表题的笔记,希望对大家有所帮助,如果喜欢,点个赞再走吧😊

leetcode 203 移除链表元素

题目链接

传送门:https://leetcode-cn.com/problems/remove-linked-list-elements/

我的题解

题目描述

给你一个以 head 开头的链表和值为 val 的整数,请你删除链表中所有满足 Node.val == val 的节点,并返回新节点。

样例

img

算法

(遍历) O ( n ) O(n) O(n)

由于题目可能变动头结点,故申请一个虚拟节点 dummy_node,然后删除所有值为 val 的节点即可。记得删除之后要释放内存以及释放自己申请的内存。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
   
public:
    ListNode* removeElements(ListNode* head, int val) {
   
        ListNode* dummy_head = new ListNode(-1);
        dummy_head->next = head;
        ListNode* cur = dummy_head;

        while (cur->next) {
   
            if (cur->next->val == val) {
   
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            }
            else cur = cur->next;
        }
        
        head = dummy_head->next;
        delete dummy_head;

        return head;
    }
};

leetcode 707 设计链表

题目链接

传送门:https://leetcode-cn.com/problems/design-linked-list/

我的题解

题目描述

题目要求设计出一个链表,可以是单链表,也可以是双链表,这里我选择设计单链表。要求实现以下功能:

  • get(index):获取第 index 个节点的值,如果索引无效,返回 -1.
  • addAtHead(val):将值为 val 的节点插入到链表头。
  • addAtTail(val):将值为 val 的节点插入到链表尾。
  • addAtIndex(index, val):将值为 val 的值插入到链表中第 index 个节点的位置,如果 index < 0 ,则插入头部,如果 index == size ,插入到尾部,如果 index > size ,无效插入。
  • deleteAtIndex(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

算法

具体见代码:

class MyLinkedList {
   
public:
    struct MyLinkedNode {
   
        int m_val;
        MyLinkedNode* m_next;

        MyLinkedNode(int val) : m_val(val), m_next(nullptr) {
   }
    };
    /* initialize the linked list */
    MyLinkedList() {
   
        m_size = 0;
        m_dummy_head = new MyLinkedNode(-1);
    }
    /* get the value of node at the index */
    int get(int index) {
   
        if (index < 0 || index > m_size - 1) return -1;

        MyLinkedNode* cur = m_dummy_head->m_next;
        for (int i = 0; i < index; ++i) 
            cur = cur->m_next;

        return cur->m_val;
    }
    /* add node to the head */
    void addAtHead(int val) {
   
        MyLinkedNode* new_head_node = new MyLinkedNode(val);

        new_head_node->m_next = m_dummy_head->m_next;
        m_dummy_head->m_next = new_head_node;
        ++m_size;
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值