《录鼎记》第三章——链表设计给我整疯了

本文介绍了博主在学习链表阶段遇到的三个问题:移除链表元素、设计链表类以及反转链表。提供了相应的LeetCode题目链接和解题思路,包括使用虚拟头节点、递归等方法。同时,博主承认链表操作是其弱项,需要更多练习来提升。
摘要由CSDN通过智能技术生成

数组阶段结束,进入了链表阶段。这是博主大一时期的弱项,希望不要太折磨。

今天的任务有三项+一基础知识点。

先附上链接代码随想录 (programmercarl.com)

知识点里面提到了约瑟夫环的问题,附上相关解读链接:(70条消息) 约瑟夫环问题_小C哈哈哈的博客-CSDN博客

一、移除链表元素

力扣题目链接 (opens new window)

题目解读:就简单的删除链表元素,不会有人不会吧!!!

笑死,差点又眼高手低,写不出来。最终搞出来了哈:代码如下:

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

    }
};

还是有一些缺点的,比如说没有删除没有用的节点。

题解附上:代码随想录 (programmercarl.com)

二、设计链表

力扣题目链接 (opens new window)

题目解读:这一题就是要完成链表的各种操作,说实话一直是我的弱点,跟着题解联系了好多次,还是会有错误,希望下次能改进吧。

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

    MyLinkedList() {
         dummyhead = new linknode(0);
        size =0 ;

    }
    
    int get(int index) {
        if(index>(size-1)||index<0){
            return -1;
        }
        linknode* cur = dummyhead->next;
        while(index--){
            cur = cur->next;
        }
        return cur->val;

    }
    
    void addAtHead(int val) {
        linknode* newh  = new linknode(val);
        newh->next = dummyhead->next;
        dummyhead->next = newh;
        size++;       

    }
    
    void addAtTail(int val) {
        linknode* cur  = dummyhead;
        while(cur->next !=nullptr){
            cur = cur->next;
        }
        linknode* newl = new linknode(val);
        size++;
        cur->next = newl;

    }
    
    void addAtIndex(int index, int val) {
        if(index>size){
            return;
        }
        if(index<0){
            index= 0;
        }
        linknode* node = new linknode(val);
        linknode* cur = dummyhead;
        while(index--){
            cur = cur->next;
        }
        node->next=cur->next;
        cur->next = node;
        size++;

    }
    
    void deleteAtIndex(int index) {
        if(index >=size ||index <0){
            return;
        }
        linknode* cur = dummyhead;
        while(index--){
            cur = cur->next;
        }
        cur->next = cur->next->next;
        size--;

    }
private:
    int size;
    linknode* dummyhead;
};

题解:代码随想录 (programmercarl.com)

三、反转链表

要点:这题是比较难的,也是有很多的解法。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* hummyhead = new ListNode(0);
        ListNode* cur =head;
        hummyhead->next = NULL;
        while(cur !=NULL ){
            ListNode* temp =cur->next;
            cur->next = hummyhead->next;
            hummyhead->next = cur;
            cur = temp;
        }
        return hummyhead ->next;

 这是我自己尝试的第一个版本,虽然有些细节问题,但大体思路是和双指针是一样的。

递归法的大致思路就是将下面这两行代码省略。

pre = cur;
cur = temp;

而另一种从后往前的递归就有一点理解难度了。

其中last的作用是返回新头节点,其中head->next->next = head;这行代码是将原先顺序的下一个指针head->next的next指向了自己,再把原来的指针断掉,实现了反转。

写到后面才发现自己的思路和虚拟头节点一样。

后面的使用栈解决,是利用了栈后进先出的特性。

题解:代码随想录 (programmercarl.com)

今天的时间比较散总体大概花了一个半小时吧。感觉链表并不是很熟。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值