首页 > 其他分享 >【链表】复习/刷题 记录

【链表】复习/刷题 记录

时间:2023-03-18 11:22:41浏览次数:54  
标签:head ListNode tem val next 链表 ans 刷题 复习

leetcode 203. Remove Linked List Elements

/**
 * 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 *tem = (ListNode*)malloc(sizeof(ListNode));
        // tem->next = head;
        
        // ListNode *p = tem;
        
        // while(p->next != NULL) {
        //     if(p->next->val == val) {
        //         p->next = p->next->next;
        //     }
        //     if(p->next && p->next->val != val) p = p->next;
        //     if(p == NULL) break;
        // }
        // return tem->next;

        if(head == NULL) return head;
        head->next = removeElements(head->next, val);
        return head->val == val ? head->next : head;
    }
};

法1 循环

法2 递归

这个写法很短,看题解所得

好久没看过链表了,写题一脸懵逼(

21. Merge Two Sorted Lists

自己写的腌臜玩意
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        ListNode *ans = (ListNode*)malloc(sizeof(ListNode)); ans->next = NULL;
        ListNode *ANS = ans;
        ListNode *p1 = list1, *p2 = list2;
        while(p1 && p2) {
            ListNode *tem = (ListNode*)malloc(sizeof(ListNode));    // try 定义到外面 公用?
            if(p1->val <= p2->val) {
                tem->val = p1->val;
                tem->next = NULL;
                ans->next = tem;
                p1 = p1->next;  ans = ans->next;
            }
            else {
                tem->val = p2->val;
                tem->next = NULL;
                ans->next = tem;
                p2 = p2->next;  ans = ans->next;
            }
        }
        while(p1) {
            ListNode *tem = (ListNode*)malloc(sizeof(ListNode));
            tem->val = p1->val;
                tem->next = NULL;
                ans->next = tem;
                p1 = p1->next;  ans = ans->next;
        }
        while(p2) {
            ListNode *tem = (ListNode*)malloc(sizeof(ListNode));
            tem->val = p2->val;
                tem->next = NULL;
                ans->next = tem;
                p2 = p2->next;  ans = ans->next;
        }
        return ANS->next;
    }
};

简洁的代码:

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        ListNode *ans = (ListNode*)malloc(sizeof(ListNode));
        ans->next = NULL;
        ListNode *ANS = ans;
        while(list1 && list2) {
            if(list1->val <= list2->val) {
                ans->next = list1; 
                ans = ans->next;
                list1 = list1->next;
            }
            else {
                ans->next = list2; 
                ans = ans->next;
                list2 = list2->next;
            }
        }
        ans->next = (list1 ? list1 : list2);
        return ANS->next;
    }
};

改进的地方:

  1. 不需要保留list1,list2这两个链表的首元素地址了,也就不需要重新定义变量
  2. 当有一个链表已经空了的时候,这时候直接让ans的next指向另外一个链表,其实就是另一个链表剩下的部分,简化了代码量

141. Linked List Cycle

法1

因为最多有1e4个点,所以当遍历到第 1e4+1 个点时肯定是有环的

class Solution {
public:
    bool hasCycle(ListNode *head) {
        int cnt = 0;
        while(head) {
            cnt++;
            head = head->next;
            if(cnt >= 10001) break;
        }
        return (cnt >= 10001);
    }
};

法2

容易想到第一次访问过一个点就记录一下,注意vis数组里存的是链表元素的数据类型(ListNode)

class Solution {
public:
    bool hasCycle(ListNode *head) {
        map<ListNode*, int> mp;
        int cnt = 0;
        while(head)  {
            if(mp[head]) return 1;
            mp[head] = 1;
            head = head->next;
        }
        return 0;
    }
};

206. Reverse Linked List

反转链表

注意LeetCode用C++编译器但是写malloc不free会报错

class Solution {
public:
   ListNode* reverseList(ListNode* head) {
       if(head == NULL) return head;
       ListNode *tem = new ListNode;
       tem->val = head->val; tem->next = NULL;
       head = head->next;
       while(head) {
           ListNode *p = new ListNode;
           p->val = head->val; p->next = tem;
           tem = p;
           head = head->next;
       }
       return tem;
   }
};

20. Valid Parentheses

法1 因为一定有括号是连在一起的,思路是每次找 {} , () , [] 三者中的一个,去掉之后check剩余部分

写得很腌臢,明显可以用 s.replace("{}", "") 来简化

class Solution {
public:
    bool isValid(string s) {
        if(s.empty()) return 1;
        int n = s.size();
        if(n % 2 || s[0] == ']' || s[0] == ')' || s[0] == '}') return 0;
        int fl = -1;
        int i = s.find("()");
        if(i != -1) {
            fl = i;
        }
        else {
            i = s.find("[]");
            if(i != -1) {
                fl = i;
            }
            else {
                i = s.find("{}");
                if(i != -1) {
                    fl = i;
                }
            }
        }
        if(fl == -1) return 0;
        else {
            string tem = ""; 
            if(fl > 0) tem += s.substr(0, fl); 
            if(fl + 2 < n) tem += s.substr(fl + 2);
            return isValid(tem);
        }
    }
};

该好好复习STL了!!!

法2 利用stack,如果遇到左括号直接push,如果是右括号,它一定是跟栈顶的括号配对。如果不配直接return 0,能配对就弹出栈顶

class Solution {
public:
    bool isValid(string s) {
        // 正解应该是stack + 肯定可以直接配对
        stack<char> Sta;
        for(auto x : s) {
            // if(!Sta.empty()) cout << Sta.top() << endl;
            if(x == '(' || x == '[' || x == '{') Sta.push(x);
            else {
                if(Sta.empty()) return 0;
                char tem = Sta.top();
                if(x == '}') {
                    if(tem == '{') Sta.pop();
                    else return 0;
                }
                else if(x == ']') {
                    if(tem == '[') Sta.pop();
                    else return 0;
                }
                else if(x == ')') {
                    if(tem == '(') Sta.pop();
                    else return 0;
                }
            }
        }
        return Sta.empty();  
    }
};

232. Implement Queue using Stacks

做法就是纯模拟啦,记得栈和队列不要看错了。

原来通过做这道题我才知道,我根本不会cpp......只是会C with STL的菜鸡罢了(呜呜呜

this和构造函数什么的,完全都忘记了啊

typedef struct {
    int val;
    struct MyQueue *next;
} MyQueue;


MyQueue* myQueueCreate() { /// 头指针
    MyQueue *head = (MyQueue*)malloc(sizeof(MyQueue));
    head->next = NULL; head->val = 0;
    return head;
}

void myQueuePush(MyQueue* obj, int x) {
    MyQueue *tem = obj;
    MyQueue *p = myQueueCreate();
    p->val = x;
    while(tem->next) tem = tem->next;
    tem->next = p;
}

int myQueuePop(MyQueue* obj) {
    if(obj->next == NULL) return NULL;
    MyQueue *tem = obj->next;
    int x = tem->val;
    obj->next = tem->next;
    return x;
}

int myQueuePeek(MyQueue* obj) {
    if(obj->next == NULL) return NULL;
    MyQueue *tem = obj->next;
    int x = tem->val;
    return x;
}

bool myQueueEmpty(MyQueue* obj) {
    return (obj->next == NULL);
}

void myQueueFree(MyQueue* obj) {

}

/**
 * Your MyQueue struct will be instantiated and called as such:
 * MyQueue* obj = myQueueCreate();
 * myQueuePush(obj, x);
 
 * int param_2 = myQueuePop(obj);
 
 * int param_3 = myQueuePeek(obj);
 
 * bool param_4 = myQueueEmpty(obj);
 
 * myQueueFree(obj);
*/

标签:head,ListNode,tem,val,next,链表,ans,刷题,复习
From: https://www.cnblogs.com/re0acm/p/17223917.html

相关文章

  • 2023/03/15刷题
    B.SorttheArray链接B.SorttheArray这个题原本也是不会然后看了别人的题解,以及学长给了一个思路学长给的思路就是找到最长的可以翻转的区间然后把这个区间翻转过......
  • 2023/03/12刷题
    A.ApplemanandToastman链接A.ApplemanandToastman这个题要计算最大值所以我们肯定直接,每次都减少最少的那个,然后使用一个变量每次把值加上最后打印出来结果就可......
  • 2023/03/13刷题
    C.BoxesPacking链接C.BoxesPacking这个题就是找相同的数字的最大值.因为每一个数字都要放在一个盒子里面打印就可以#include<iostream>#include<algorithm>#i......
  • 2023/03/14刷题
    A.IQtest链接A.IQtest这个题就是给一个数数组,数组有两种情况。要么有n-1个奇数和一个偶数要么有n-1个偶数和一个奇数让我们求出这一个奇数和一个偶数所在数组......
  • day3 | 203. 移除链表元素,206. 反转链表,707. 设计链表
    203.移除链表元素 题目描述 给你一个链表的头节点head和一个整数val,删除链表中的那些存储的值为val的节点,并且返回新的头节点。 思路: 1.创建一个虚拟头节点,......
  • 力扣---24. 两两交换链表中的节点
    给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,......
  • 前端-笔试刷题-JavaScript
    基本数据类型检测题目描述请补全JavaScript函数,要求以字符串的形式返回参数的类型。注意:只需检测基本数据类型。点击查看代码function_typeof(value){//......
  • 力扣24 两两交换链表中的节点
    两两交换链表中的节点:先把一个链表分为两个链表,再把两个链表组成一个链表。注意最后可能有一个链表有剩余,但此时另一个链表的指针已经到了NULL,要再遍历一遍/提前记录(感觉......
  • 前端-笔试刷题-新窗口打开
    题目描述请写出可以在新窗口打开文档的a标签。点击查看代码<!--补全代码--><ahref="#"target="_blank">链接</a>效果图:![](https://img2023.cnblogs.com/b......
  • 算法刷题-记票统计-JAVA
    0x00引言为获取一个良好的算法思维,以及不再成为一个脚本小子,争取每天一道算法题,培养自己的逻辑思维,温顾各类型语言语法知识。题解只写自己理解的解法,其他解法不再增加。......