首页 > 其他分享 >[刷题记录Day3]Leetcode链表专题

[刷题记录Day3]Leetcode链表专题

时间:2023-07-01 14:46:49浏览次数:58  
标签:pre ListNode cur val int Day3 next 链表 Leetcode

# ListNode definition
public class ListNode {
    // 结点的值
    int val;
    // 下一个结点
    ListNode next;
    // 节点的构造函数(无参)
    public ListNode() {
    }
    // 节点的构造函数(有一个参数)
    public ListNode(int val) {
        this.val = val;
    }
    // 节点的构造函数(有两个参数)
    public ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

No.1

题目

移除链表元素

思路

  • 设置dummyHead以相同方式处理以下情况
    • 待删除节点处于头节点
    • 待删除节点处于链表中间
  • 遍历链表,遇到目标就 pre.next = cur.next ,复杂度O(n)

代码

// 设置dummyHead.next=head  
ListNode dummyHead = new ListNode(0, head);  
// 从head开始遍历  
ListNode pre = dummyHead;  
ListNode cur = head;  
// 空数组,直接返回null  
if (head == null)  
    return null;  
// 外层循环遍历ListNode中的val值  
while (cur != null) {  
    if (cur.val == val)  
        pre.next = cur.next;  
    elsepre = cur;  
    cur = cur.next;  
}  
return dummyHead.next;

No.2

题目

设计链表

思路

  • 厘清每个方法要求实现的功能和边界条件
  • addAtHead(int val)addAtTail(int val)其实都是addAtIndex(int index, int val)的特殊情况
  • add和delete的时候同步nodeNum

代码

class MyLinkedList {  
    private int nodeNum;  
    private ListNode dummyHead;  
    public MyLinkedList() {  
        dummyHead = new ListNode();  
        nodeNum = 0;  
    }  
    public int get(int index) {  
        if (index < 0 || index >= nodeNum)  
            return -1;  
        ListNode cur = dummyHead.next;  
        int count = 0;  
        // 只要不满足,就一直往count++的方向找  
        while (count < index) {  
            cur = cur.next;  
            count++;  
        }  
        // 退出while,count == index  
        return cur.val;  
    }  
    public void addAtHead(int val) {  
        addAtIndex(0, val);  
    }  
    public void addAtTail(int val) {  
        addAtIndex(nodeNum, val);  
    }  
    public void addAtIndex(int index, int val) {  
        if (index >= 0 && index <= nodeNum) { // 把index==nodeNum的情况考虑进来  
            ListNode pre = dummyHead;  
            ListNode cur = pre.next;  
            int count = 0;  
            while (count < index) {  
                pre = cur;  
                cur = cur.next;  
                count++;  
            }  
            ListNode newNode = new ListNode(val);  
            nodeNum++;  
            pre.next = newNode;  
            newNode.next = cur;  
        }  
    }  
    public void deleteAtIndex(int index) {  
        if (index >= 0 && index < nodeNum) { // index==nodeNum感觉越界了,就没有包括进来  
            ListNode pre = dummyHead;  
            ListNode cur = pre.next;  
            int count = 0;  
            // 只要不满足,就一直往count++的方向找  
            while (count < index) {  
                pre = cur;  
                cur = cur.next;  
                count++;  
            }  
            // 退出while,count == index  
            pre.next = cur.next;  
            nodeNum--;  
        }  
    }  
}

No.3

题目

反转链表

思路

  • 双指针pre和cur,一边遍历一遍反转
  • 提前存储cur.next值,便于cur.next=pre后找到原来下一个节点的位置
  • 注意pre=curcur=tmp操作的顺序

代码

public ListNode reverseList(ListNode head) {  
    ListNode pre = null, cur = head;  
    while (cur != null) {  
        // 先存下cur.next  
        ListNode tmp = cur.next;  
        // 反转指向:cur指向pre  
        cur.next = pre;  
        // 更新pre和cur指向,为下次操作准备:  
        pre = cur;  
        cur = tmp;  
    }  
    return pre;  
}

标签:pre,ListNode,cur,val,int,Day3,next,链表,Leetcode
From: https://www.cnblogs.com/tomatoQt/p/17519256.html

相关文章

  • 【leetcode】【206】【反转链表】
    c++第一个方法#include<algorithm>#include<iostream>#include<memory>#include<vector>//Definitionforsingly-linkedlist.structListNode{intval;ListNode*next;ListNode():val(0),next(nullptr){}Li......
  • js 数组和链表分别实现队列
    链表实现/***1.单项链表实现队列,但要同时记录head和tail*2.要从tail入队,head出对,否则出队时,tail不好定位*2.单独记录length,不可遍历链表获取length*/classMyQueue{head=null;//头tail=null;//尾len=0;add(n){letnewNode={......
  • 【leetcode】【83】【移除链表元素】
    c++第一个方法#include<algorithm>#include<iostream>#include<memory>#include<vector>//Definitionforsingly-linkedlist.structListNode{intval;ListNode*next;ListNode():val(0),next(nullptr){}Li......
  • LeetCode 142. 环形链表 II
    /***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode(intx):val(x),next(NULL){}*};*/classSolution{public:ListNode*detectCycle(ListNode*head){if(!head)return......
  • LeetCode算法题---最长回文子串、N 字形变换(四)
    5.最长回文子串题目要求:给你一个字符串 s,找到 s 中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。示例1: 输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。 示例2:输入:s="cbbd"输出:"bb"提示:1<=s.length<=1000s仅由数字......
  • [刷题记录]Leetcode列表专题
    No.1题目Leetcodelink思路数组本身是非降序,即最小值和最大值在数组的两端非降序数组每个元素平方后,最大值在两端,最小值在中部双指针比较数组两端最大值的大小,提取出最大的。移动双指针,然后得到次大,次次大,逐步得到结果注意left==right是有意义的,即待处理数组只有一个元素,......
  • leetcode -- Maximum Gap -- 与distributed sorting有关,重点复习一下
    https://leetcode.com/problems/maximum-gap/sort算法除了比较算法之外,还有distributedsort,时间效率可以优于O(nlogn),甚至可以达到O(n).包括coutingsort,bucketsort,radixsort.复习这三种的原理。参考https://www.byvoid.com/blog/sort-radix这里对于bucketsort,提到可能......
  • leetcode 19. 删除链表的倒数第 N 个结点
    链表问题,需要注意一下是倒着数还是正着数,和头结点会不会被删除即可publicListNoderemoveNthFromEnd(ListNodehead,intn){if(head==null){returnnull;}//头结点会被删除吗?intlength=0;ListNodep=......
  • Leetcode 20. 有效的括号
    可以将反括号先存入map中,而后如果当前字符能在map中查到,说明是反括号,否则是正括号。但是结合map的使用和将反括号作为map的key,并不容易第一时间想到。classSolution{public:boolisValid(strings){intn=s.size();if(n%2){//如......
  • 【leetcode】【83】【删除排序链表中的重复元素】
    c++第一个方法代码#include<algorithm>#include<iostream>#include<memory>#include<vector>//Definitionforsingly-linkedlist.structListNode{intval;ListNode*next;ListNode():val(0),next(nullptr){}......