算法训练第三天| 203.移除链表元素、707.设计链表、206.反转链表

链表|203.移除链表元素、707.设计链表、206.反转链表


203.移除链表元素

自己审题思路

移除链表元素,需要拿到移除元素的前一个Node地址

看完代码随想录题解后的收获

链表操作,特别是链表删除操作,建立一个虚拟节点指向头结点会很方便(否则需要考虑删除的是否是头结点)。

代码:
/*
struct ListNode {
  int val;
  ListNode*  next;
  ListNode(int val) : val(val), next(nullptr) {}
};*/
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        if (head == nullptr) return head;
        ListNode* dummyNode = new ListNode();
        dummyNode->next = head;
        ListNode* cur = dummyNode;
        while (cur->next) {
            if (cur->next->val == val) {
                cur->next = cur->next->next;
            } else {
                cur = cur->next;
            }

        }
        return dummyNode->next;
    }
};

参考详解


707.设计链表

自己审题思路

考察具体的链表操作,其中有一些细节需要注意

看完代码随想录题解后的收获

这道题覆盖了链表的常见操作,是练习链表操作非常好的一道题
其中细节比较容易犯错,借着这道题debug了一遍代码,算是为后续代码debug开个头

能够debug的代码:
// @before-stub-for-debug-begin
#include <vector>
#include <string>
#include<iostream>

using namespace std;
// @before-stub-for-debug-end

/*
 * @lc app=leetcode.cn id=707 lang=cpp
 *
 * [707] 设计链表
 */

// @lc code=start


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

    MyLinkedList() {
        dummyNode = new ListNode(-1);
        size = 0;
    }
    
    int get(int index) {
        if (index > (size - 1) || index < 0) return -1;
        ListNode* cur = dummyNode->next;
        while(index--){
            cur = cur->next;
        }
        return cur->val;
    }
    
    /* void addAtHead(int val) {
        ListNode* newNode = new ListNode(val);
        ListNode* cur = dummyNode;
        cur->next = newNode;         //错误写法,没有将newNode->next定义,每次给链表头插入元素之后,之前添加的元素就丢失了
        size++;
    } */
    void addAtHead(int val) {
        ListNode* newNode = new ListNode(val);
        newNode->next = dummyNode->next;
        dummyNode->next = newNode;
        size++;
    }
    
    void addAtTail(int val) {
        ListNode* newNode = new ListNode(val);
        ListNode* cur = dummyNode;
        int x = size;
        while (x--) {// 之前这里使用的size--,错误,不能将size值改变!!!
            cur = cur->next;
        }
        cur->next = newNode;
        size++;
    }
    
    void addAtIndex(int index, int val) {
        if (index > size) return;
        if (index < 0) index = 0;
        ListNode* newNode = new ListNode(val);
        ListNode* cur = dummyNode;
        while (index--) {
            cur = cur->next;
        }
        ListNode* temp = cur->next;
        cur->next = newNode;
        newNode->next = temp;
/*         newNode->next = cur->next;
        cur->next = newNode; */
        size++;
    }
    
    void deleteAtIndex(int index) {
        if (index >= size || index < 0) return;
        ListNode* cur = dummyNode;
        ListNode* temp;
        while (index--) {
            cur = cur->next;
        }
        temp = cur->next;
        cur->next = cur->next->next;
        delete temp;
        temp = nullptr;
        
        size--;
    }

    void printLinkedList() {
        ListNode* cur = dummyNode;
        while (cur->next != nullptr) {
            cout << cur->next->val << " ";
            cur = cur->next;
        }
        cout << endl;
        system("pause");
    }

private:
    ListNode* dummyNode;
    int size; 
};

int main () {
    MyLinkedList* myLinkedList = new MyLinkedList();
    myLinkedList->addAtHead(1);
    myLinkedList->addAtHead(3);
    myLinkedList->addAtHead(1);
    // myLinkedList->addAtTail(3);
    myLinkedList->addAtIndex(3, 0); 
    myLinkedList->printLinkedList();
    myLinkedList->addAtIndex(1, 2);    
    myLinkedList->printLinkedList();
    myLinkedList->get(1);           
    myLinkedList->printLinkedList();
    myLinkedList->deleteAtIndex(1);  
    myLinkedList->printLinkedList();
    cout << myLinkedList->get(1) << endl;

    return 0;
}
/* int main () {
    MyLinkedList* myLinkedList = new MyLinkedList();
    myLinkedList->addAtHead(1);
    myLinkedList->addAtTail(3);
    myLinkedList->printLinkedList();
    myLinkedList->addAtIndex(1, 2);    // 链表变为 1->2->3
    myLinkedList->printLinkedList();
    myLinkedList->get(1);              // 返回 2
    myLinkedList->printLinkedList();
    myLinkedList->deleteAtIndex(1);    // 现在,链表变为 1->3
    myLinkedList->printLinkedList();
    cout << myLinkedList->get(1) << endl;              // 返回 3

    return 0;
} */

如果将ListNode* dummyNode定义在结构体struct ListNode之前,在编译时就会出现以下报错:
error: incompatible pointer types assigning to 'ListNode *' from 'MyLinkedList::ListNode *'
new ListNode(-1) 是MyLinkedList::ListNode *类型,而 dummyNode被识别成了ListNode *类型,因为在类MyLinkedList定义struct ListNode之前就定义了 dummyNode。

4070d4cf0f962addb13c89dcdedeb00.png

参考详解


206.反转链表

自己审题思路

经典题,双指针,将后一个节点指向前一个节点

看完代码随想录题解后的收获

利用双指针的思路写出递归版本代码

双指针代码:
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head == nullptr || head->next == nullptr) return head;
        ListNode* pre = nullptr;
        ListNode* cur = head;
        while(cur) {
            ListNode* tmp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = tmp;
            
        }
        return pre;
    }
};
递归版本代码:
class Solution {
public:
    ListNode* reverse(ListNode* pre, ListNode*cur) {
        if(cur == nullptr) return pre;
        ListNode* tmp = cur->next;
        cur->next = pre;
        return reverse(cur, tmp);
    }
    ListNode* reverseList(ListNode* head) {
        return reverse(nullptr, head);
    }
};

参考详解


今日感想:

1、代码隐藏的bug还是需要好好debug看看变量的变化过程;
2、还是要加强C++语法的熟悉。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容