首页 > 编程语言 >代码随想录算法训练营 第三天 链表 Leetcode203 移除链表元素 Leetcode707 设计链表 Leetcode 206 反转链表

代码随想录算法训练营 第三天 链表 Leetcode203 移除链表元素 Leetcode707 设计链表 Leetcode 206 反转链表

时间:2024-06-07 09:13:35浏览次数:7  
标签:pre ListNode val int 随想录 next 链表 移除

Leetcode203 移除链表元素 

题目链接

注意 为了使后续节点方式统一  要人为设置链表头节点

链表的处理 一定要明白如何找前置节点

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head == null){
            return head;
        }
        ListNode dummy = new ListNode(-1,head);
        ListNode pre = dummy;
        ListNode now = head;
        while(now != null){
            if(now.val == val){
                pre.next = now.next;
            }else{
                pre = now;
            }
            now = now.next;
        }
        return dummy.next;
    }
}

Leetcode 707 设计链表

题目链接

注意设计链表 要掌握 ::设计链表节点,设计头节点,设计链表长度,掌握如何查找前置节点,和当前节点

class ListNode{
    int val;
    ListNode next;

    ListNode() {}

    ListNode(int val) {
        this.val = val;
    }
}

class MyLinkedList {
    int size;
    ListNode head;

    public MyLinkedList() {
        this.size = 0;
        head = new ListNode(-1);
    }

    public int get(int index) {
        if (index < 0 || index >= size) {
            return -1;
        }
        ListNode cur = head;
        for (int i = 0; i <= index; i++) {
            cur = cur.next;
        }
        return cur.val;
    }

    public void addAtHead(int val) {
        addAtIndex(0, val);
    }

    public void addAtTail(int val) {
        addAtIndex(size, val);
    }

    public void addAtIndex(int index, int val) {
        if (index <= size) {
            ListNode pre = head;
            ListNode p = new ListNode(val);

            for (int i = 0; i < index; i++) {
                pre = pre.next;
            }
            p.next = pre.next;
            // if(index == size){
            //     p.next = null;
            // }else{
            //     p.next = pre.next;
            // }
            
            pre.next = p;
            size++;
        }

    }

    public void deleteAtIndex(int index) {
        if (index < 0 || index >= size) {
            return;
        }
        ListNode pre = head;
        for (int i = 0; i < index; i++) {
            pre = pre.next;
        }
        pre.next = pre.next.next;
        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);
 */

 Leetcode 206 反转链表

题目链接

 利用双指针思想 直接原地反转 不用新的空间

改变指针方向

首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。

然后就要开始反转了,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。

为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。

接下来,就是循环走如下代码逻辑了,继续移动pre和cur指针。

最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。 此时我们return pre指针就可以了,pre指针就指向了新的头结点

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode dummy = new ListNode(-1,head);
        ListNode cur = head;
        ListNode pre = null;
        ListNode tmp = null;
        while(cur!=null){
        
            tmp = cur.next;
            
            cur.next = pre;
            pre = cur;
            cur = tmp;
        }

        return pre;
    }
}

 

标签:pre,ListNode,val,int,随想录,next,链表,移除
From: https://www.cnblogs.com/determination-e/p/18236467

相关文章

  • 代码随想录算法训练营第30天 | 332.重新安排行程 、51. N皇后、37. 解数独
    332.重新安排行程(可跳过)https://programmercarl.com/0332.重新安排行程.html有难度,涉及到图,有些用例会超时/***@param{string[][]}tickets*@return{string[]}*/varfindItinerary=function(tickets){constres=['JFK'];constmap={};for(le......
  • 代码随想录第2天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,数组总结
    题目:977.有序数组的平方思路:first.for循环,平方,然后sort排序,提交通过啊哈~|但时间复杂度大O(n+nlogn),->O(nlogn)的时间复杂度,题目进阶要求时间复杂度为O(n)second.双指针。题目为有序数组,包含负数,则平方后,最大值在数组的两头,则使用双指针进行,两个比较大小,大的存入新......
  • 代码随想录算法训练营第二十九天 | 491.非递减子序列
    491.非递减子序列题目链接文章讲解视频讲解层间去重:回溯法相当于深搜,所以所以是一直递归到叶节点才开始回溯;每次进入backtracking也就进入了搜索树的下一层,所以每进入一层需要用一个used_set来记录使用过的元素;classSolution{private:vector<int>sub;vecto......
  • 6.6--链表
    链表的定义C++的定义链表节点方式,如下所示://单链表structListNode{intval;//节点上存储的元素ListNode*next;//指向下一个节点的指针ListNode(intx):val(x),next(NULL){}//节点的构造函数};不定义构造函数,C++默认生成一个构造函数,但是这......
  • 代码随想录算法训练营第一天 | 704. 二分查找 27. 移除元素
    704.二分查找题目:给定一个n个元素有序的(升序)整型数组和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。提示:1.你可以假设nums中的所有元素是不重复的。2.n将在[1,10000]之间。3.nums的每个元素都将在[-9999,9999]之间。解题:思路:二......
  • 代码随想录算法训练营第二十八天 | 93.复原IP地址
    93.复原IP地址题目链接文章讲解视频讲解classSolution{private:vector<string>ip;vector<string>result;public:vector<string>restoreIpAddresses(strings){backtracking(s,0);returnresult;}voidbacktrackin......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素(数组)
    第一次打卡,记录还不够充分,会慢慢丰富起来一、二分查找题目链接:704.二分查找-力扣(LeetCode)讲解链接:Carl讲解视频讲解:代码随想录讲解 情况1:左闭右闭区间情况2:左闭右开区间 二、移除元素题目链接:27.移除元素-力扣(LeetCode)讲解链接:Carl讲解视频讲解:代码随想......
  • 代码随想录算法训练营第一天 | 704. 二分查找,27. 移除元素
    题目链接:704.二分查找思路:该题为有序数组查找,采用二分法。根据区间分为左闭右闭和左闭右开两种情况坑:左右区间的开闭补充:vector容器时间复杂度:O(logn)空间复杂度:O(1)题目链接:27.移除元素思路:题目说返回k个元素之后留下什么不重要,也不考虑数组剩下元素的......
  • 代码随想录 数组总结
    数组总结主要包括二分法双指针滑动窗口模拟 二分法 循环不变量原则拓展考虑学习浮点数二分整数二分扩展题目双指针 快慢指针 原地解决问题、双向解决问题 滑动窗口滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)......
  • 代码随想录算法训练营第29天 | 491.递增子序列 、46.全排列 、47.全排列 II
    491.递增子序列本题和大家刚做过的90.子集II非常像,但又很不一样,很容易掉坑里。https://programmercarl.com/0491.递增子序列.html视频讲解:https://www.bilibili.com/video/BV1EG4y1h78v关键点还要在于本层使用过的数字不能再使用/***@param{number[]}nums*@return......