代码随想录算法训练营第三天| 203. 移除链表元素 707.设计链表 206.反转链表

203. 移除链表元素
https://leetcode.cn/problems/remove-linked-list-elements/description/

public ListNode removeElements(ListNode head, int val) {
        if (head == null) return head;
        ListNode wHead = new ListNode(Integer.MAX_VALUE,head);
        ListNode p = head;
        ListNode pre = wHead;
        while (p != null){
            if (p.val == val){
                pre.next = p.next;
                p = pre.next;
            }else {
                pre = pre.next;
                p = p.next;
            }
        }
        return wHead.next;
    }

总结:这破题,出的就有问题,这就是不带头结点的链表,非得说是带头节点的,哪有带头节点的链表头结点还有值的啊,破题浪费我半个多小时
707.设计链表
https://leetcode.cn/problems/design-linked-list/description/

class MyLinkedList {
    int size;

    ListNode head;

    public MyLinkedList(){
        size = 0;
        head = new ListNode(Integer.MAX_VALUE);
    }
    public int get(int index){
        if (index < 0 || index >= size){
            return -1;
        }
        ListNode p = head;
        for (int i = 0; i <= index; i++) {
            p = p.next;
        }
        return p.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 || index < 0) return;
        ListNode p = head;
        for (int i = 0; i < index; i++) {
            p = p.next;
        }
        if (index == size){
            ListNode newNode = new ListNode(val);
            p.next = newNode;
            size++;
        }else {
            ListNode newNode = new ListNode(val,p.next);
            p.next = newNode;
            size++;
        }
    }
    public void deleteAtIndex(int index){
        if (index < 0 || index >= size) return;
        ListNode p = head;
        for (int i = 0; i < index; i++) {
            p = p.next;
        }
        p.next = p.next.next;
        size--;
    }
    class ListNode {
    int val;
      ListNode next;
      ListNode() {}
      ListNode(int val) { this.val = val; }
      ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  }
}

总结:细致一点就好了,不要急
206.反转链表
https://leetcode.cn/problems/reverse-linked-list/description/

//头插法
public static ListNode reverseList(ListNode head) {
        ListNode newHead = new ListNode();
        while (head != null){
            ListNode l = head.next;
            head.next = newHead.next;
            newHead.next = head;
            head = l;
        }
        return newHead.next;
    }
//三指针法
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode p = head;
        ListNode temp = null;
        while (p != null){
            temp = p.next;
            p.next = pre;
            pre = p;
            p = temp;
        }
        return pre;
    }

总结:注意辨析题目到底是不是个有头结点的链表,很烦,两种方法,头插法,三指针(逻辑上通过改变指针走向去实现翻转)

posted @   jeasonGo  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示