首页 > 编程语言 >【算法训练营day3】LeetCode203. 移除链表元素 707. 设计链表 206. 反转链表

【算法训练营day3】LeetCode203. 移除链表元素 707. 设计链表 206. 反转链表

时间:2022-10-14 22:55:21浏览次数:90  
标签:ListNode val int 707 next 链表 移除 LinkedNode

【算法训练营day3】LeetCode203. 移除链表元素 707. 设计链表 206. 反转链表

LeetCode203. 移除链表元素

题目链接:203. 移除链表元素

初次尝试

题目比较简单,之前刷过链表的题,有一段时间不碰了,刚开始对语法有一点生疏,后面找到感觉了,一遍ac。

/**
 * 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* newHead = new ListNode(0, head);
        ListNode* p = newHead;
        ListNode* temp;

        while (p -> next != NULL) {
            if (p -> next -> val == val) {
                temp = p -> next;
                p -> next = temp -> next;
                delete temp;
            }
            else p = p -> next;
        }
        
        return newHead -> next;
    }
};

看完代码随想录后的想法

思路是一样的,感觉虚拟头节点的代码会更简单,思考量也会更小。


LeetCode707. 设计链表

题目链接:707. 设计链表

初次尝试

思考量不大的一道题,比较考验基本功,一遍ac。

class MyLinkedList {
public:
    struct LinkedNode {
        int val;
        LinkedNode* next;
        LinkedNode(int val) : val(val), next(nullptr) {}
    };

    MyLinkedList() {
        _newHead = new LinkedNode(0);
        _size = 0;
    }
    
    int get(int index) {
        LinkedNode* p = _newHead;

        for (; index >= 0; index--) {
            p = p -> next;
            if (p == NULL) return -1;
        }

        return p -> val;
    }
    
    void addAtHead(int val) {
        LinkedNode* newNode = new LinkedNode(val);
        newNode -> next = _newHead -> next;
        _newHead -> next = newNode;
        _size++;
    }
    
    void addAtTail(int val) {
        LinkedNode* newNode = new LinkedNode(val);
        LinkedNode* p = _newHead;

        for (int i = 0; i < _size; i++) {
            p = p -> next;
        }

        p -> next = newNode;
        _size++;
    }
    
    void addAtIndex(int index, int val) {
        if (index < 0) addAtHead(val);
        LinkedNode* newNode = new LinkedNode(val);
        LinkedNode* p = _newHead;

        for (; index > 0; index--) {
            p = p -> next;
            if (p == NULL) return;
        }

        newNode -> next = p -> next;
        p -> next = newNode;
        _size++;
    }
    
    void deleteAtIndex(int index) {
        LinkedNode* p = _newHead;
        LinkedNode* temp;

        for (; index > 0; index--) {
            p = p -> next;
            if (p -> next == NULL) return;
        }

        temp = p -> next;
        p -> next = temp -> next;
        delete temp;
        _size--;
    }

private:
    LinkedNode* _newHead;
    int _size;
};

/**
 * 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);
 */

看完代码随想录后的想法

思路一样。


LeetCode206. 反转链表

题目链接:206. 反转链表

初次尝试

我的想法是建一个新的链表,然后遍历旧链表,依次插入到新链表中,一遍ac。

/**
 * 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* reverseList(ListNode* head) {
        if (head == NULL) return NULL;
        ListNode* ans = new ListNode();
        ListNode* p = head;
        ListNode* temp = p -> next;

        while (p != NULL) {
            p -> next = ans -> next;
            ans -> next = p;
            p = temp;
            if (temp == NULL) break;
            temp = temp -> next;
        }

        return ans -> next;
    }
};

看完代码随想录后的想法

题解的方法非常巧妙,确实只需要两个指针遍历链表将next指针反向就行了。

/**
 * 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* reverseList(ListNode* head) {
        ListNode* cur = head;
        ListNode* pre = NULL;
        ListNode* temp;

        while (cur) {
            temp = cur -> next;
            cur -> next = pre;
            pre = cur;
            cur = temp;
        }
        
        return pre;
    }
};

标签:ListNode,val,int,707,next,链表,移除,LinkedNode
From: https://www.cnblogs.com/BarcelonaTong/p/16793264.html

相关文章

  • 24. 两两交换链表中的节点
    24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例......
  • 【leetcode_C语言_数组_day1】 704.二分查找&&27. 移除元素
    704.二分查找1.题目给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输......
  • 刷题 LeetCode 203 707 206
    代码随想录LeetCode203. 移除链表元素carl链表#dummyNode思路借助dummyNode简化判断条件细节dummyNode方法保持操作一致性LeetCode707. 设计链表carl......
  • 代码随想录算法训练营第三天 | 203.移除链表元素 707.设计链表 206.反转链表
    链表的数据结构基础链表结构链表是一种通过指针串联在一起的线性结构。每一个节点由两钟部分构成,一部分是数据域,一部分是指针域,指针域存放的指针指向另一个节点。链表......
  • 206. 反转链表
    206.反转链表给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例......
  • Python 如何移除旧的版本特性,如何迎接新的特性?
    2020年4月20日,Python2的最后一个版本2.7.18发布了,这意味着Python2是真正的EOL(endoflife)了,一个时代终于落幕了。Python2.0版本是在2000年发布的,至今正好......
  • 83. 删除排序链表中的重复元素
    题目描述给定一个已排序的链表的头head,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表。示例代码varremoveDuplicates=function(nums){if(n......
  • 代码随想录训练营第三天 |203.移除链表元素, 707.设计链表, 206.反转链表
    第三天是链表,要注意的是可以创建虚拟头节点来进行链表操作。203.移除链表元素classSolution{publicListNoderemoveElements(ListNodehead,intval){......
  • 160. 相交链表
    题目描述给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。题目解释参考代码vargetInters......
  • 141. 环形链表
    题目描述给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内......