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

代码随想录算法训练营第三天

今日目标:

203.移除链表元素
707.设计链表
206.反转链表

代码随想录

203.移除链表元素

题意:删除链表中等于给定值 val 的所有节点。

示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]

示例 2: 输入:head = [], val = 1 输出:[]

示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]

思路:哇,我竟然手写出来了(我哭死),直接想到了设置虚拟节点,自己手写了一遍代码,编译器没有通过,发现是循环结束条件写成了q.next!=null;找到bug之后就通过了。
一定要注意,设置虚拟节点之后,返回的是headNode.next

//设置虚拟节点
public ListNode removeElements(ListNode head, int val) {
        if(head==null) return head;
        ListNode headNode = new ListNode(0);
        headNode.next = head;
        ListNode p = headNode;
        ListNode q = p.next;
        while(p.next!=null){
            if(q.val!=val){
                p=q;
                q=q.next;
            }else {
                p.next=q.next;
                q=p.next;
            }
        }
        return headNode.next;

    }
//不虚拟节点
public ListNode removeElementsA(ListNode head, int val) {
        
        while(head!=null && head.val==val){
            head=head.next;
        }
        if(head==null) return head;

        //这里第一个节点一定不==val
        ListNode p = head;
        ListNode q = p.next;
        while(p.next!=null){
            if(q.val!=val){
                p=q;
                q=q.next;
            }else{
                p.next=q.next;
                q=p.next;
            }
        }
        return head;


    }

707.设计链表

啊啊啊啊啊啊 真的会被气死,谁家好人小bug找这么长时间,
前边 已经新建一个 head,到底是谁又 new!!! head = new ListNode(0);

public class MyLinkedList extends ListNode {
    int size;
    ListNode head;

    public MyLinkedList(){
        int size = 0;
        // 不要再 ListNode head 了!!!
        head = new ListNode(0);

    }

    public void addAtHead(int val) {
        ListNode p = head;
        ListNode q  = new ListNode(val);
        q.next = p.next;
        p.next = q;
        size++;
    }

    public void addAtTail(int val) {
        ListNode p = head;
        ListNode q = p.next;
        while(p.next!=null){
            p=p.next;
        }
        p.next = new ListNode(val);
        p.next.next = null;
        size++;
    }

    public void addAtIndex(int index, int val) {
        if(index>size){
            return;
        }
        if(index<0){
            index = 0;
        }
        ListNode p = head;
        for(int i = 0;i<index;i++){
            p=p.next;
        }
        ListNode q = new  ListNode(val);
        q.next = p.next;
        p.next = q;
        size++;
    }

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

    public void deleteAtIndex(int index) {
        ListNode p = head;
        if(index< 0 || index>=size){
                return;
        }
        size--;
        if(index==0){
            head = head.next;
            return;
        }
        for(int i =0;i<index;i++){
            p = p.next;
        }
        p.next=p.next.next;
       }

    }

206.反转链表

今天时间来不及惹,没有好好思考这道题,(明天补上)

public ListNode reverseList(ListNode head) {
        if(head==null){
            return head;
        }
        ListNode prev = null;
        ListNode cur = head;
        ListNode temp = null;

        while(cur!=null){
            temp  = cur.next;
            cur.next=prev;
            prev=cur;
            cur = temp;
        }
        return prev;

    }
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值