IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode刷题——链表 -> 正文阅读

[数据结构与算法]leetcode刷题——链表

1.leetcode203移除链表元素(简单)

题目连接:https://leetcode-cn.com/problems/remove-linked-list-elements/submissions/

解法:设置虚拟头节点

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* virtualhead = new ListNode();
        virtualhead->next = head;
        ListNode* p = virtualhead;
        while (p->next != NULL)
        {
            if (p->next->val == val)
            {
                ListNode* tmp =  p->next;
                p->next = p->next->next;
                delete tmp;
            }
            else
                p = p->next;
        }
        head = virtualhead->next;
        delete virtualhead;
        return head;
    }
};

注意:记得释放需要删除的节点的内存。

2.leetcode707设计链表(中等)

题目链接:https://leetcode-cn.com/problems/design-linked-list/

#include<iostream>
using namespace std;

class MyLinkedList {
public:
    struct ListNode
    {
        int val;
        ListNode* next;
        ListNode(int val):val(val),next(NULL){}
    };
    ListNode* dummyHead;
    MyLinkedList() {
        dummyHead = new ListNode(0);
    }
    //获取链表中第index个节点的值
    int get(int index) {
        ListNode* p = dummyHead->next;
        int i = 0;
        while (p!= NULL && i < index)
        {
            p = p->next;
            i++;
        }
        if (p!= NULL) return p->val;
        else  return -1;
    }
    //在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
    void addAtHead(int val) {
        ListNode* p = new ListNode(val);
        ListNode* ret = dummyHead->next;
        dummyHead->next = p;
        p->next = ret;
    }
    // addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
    void addAtTail(int val) {
        ListNode* p = dummyHead;
        while (p->next != NULL)
        {
            p = p->next;
        }
        ListNode* newNode = new ListNode(val);
        p->next = newNode;
        newNode->next = NULL;
    }

    //在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
    void addAtIndex(int index, int val) {
        if (index <= 0)
        {
            addAtHead(val);
            return;
        }
        ListNode* p = dummyHead;
        int i = 0;
        while (p!= NULL && i < index)
        {
            p = p->next;
            i++;
        }
        if (p!= NULL)
        {
            ListNode *newnode=new ListNode(val);
            newnode->next = p->next;
            p->next = newnode;
        }
    }
    
    //eleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
    void deleteAtIndex(int index) {
        if(index == 0) 
        {
            ListNode* p = dummyHead->next;
            dummyHead->next = p->next;
            delete p;
            return;
        }
        else if (index > 0)
        {
            ListNode* p = dummyHead;
            int i = 0;
            while (p!= NULL && i < index)
            {
                p = p->next;
                i++;
            }
            if(p == NULL)
            {
                return;
            }
            else if(p->next != NULL)
            {
            ListNode* ret = p->next;
            p->next = ret->next;
            delete ret;
            return;
            }
        }
    }
};

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList* obj = new MyLinkedList();
 * int param_1 = obj->get(index);
 * obj->addAtHead(val);
 * obj->addAtTail(val);
 * obj->addAtIndex(index,val);
 * obj->deleteAtIndex(index);
 */

3.leetcode206反转链表(简单)

题目链接:https://leetcode-cn.com/problems/reverse-linked-list/

#include<iostream>
using namespace std;

//  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* reverseList(ListNode* head) {
        if (head == NULL || head->next == NULL) return head;
        else
        {
            ListNode* newhead = NULL;
            while (head != NULL)
            {
                ListNode* tmp = head->next;
                head->next = newhead;
                newhead = head;
                head = tmp;
            }
            return newhead;
        }

    }
};

4.leetcode24两两交换链表中的节点(中等)

题目链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs/submissions/

解法一、递归法


 
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if (head == NULL || head->next == NULL)
        {
            return head;
        }
        else
        {
            ListNode* newhead = head->next;
            head->next = swapPairs(newhead->next);
            newhead->next = head;
            return newhead;
        }
    }
};

解法二 非递归法

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-27 11:02:06  更:2022-02-27 11:02:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 15:25:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码