Java数据结构单链表删除指定值

有一个整数单链表L,设计一个算法删除其中所有值为x的结点。例如L=(1,2,2,3,1),x=2,删除后L=(1,3,1)。

public class MyLinkedList {
    class Node {
        //定义的节点类
        int val;//节点的数据域
        Node next;//节点的地址域
        Node(int val) {
            //构造方法
            this.val = val;
        }
    }
    int size;//链表的size属性,表示链表长度
    Node head;//链表的第一个元素的引用
    /** Initialize your data structure here. */
    public MyLinkedList() {
        //初始化链表
        this.size = 0;
        this.head = null;
    }

    //头部插入
    public Node addAtHead(int val) {
        Node dummyHead = new Node(-1);
        //这里使用虚拟头节点的方法,目的是让头节点作为虚拟链表的第二个节点这样不需要对头节点特殊处理
        dummyHead.next = head;
        Node cur = new Node(val);//实例化一个元素值为val的节点
        //插入
        cur.next = head;
        dummyHead.next = cur;
        head = cur;
        size ++;
        //更改头节点指向
        head = dummyHead.next;
        return dummyHead.next;
    }

    //尾部插入
    public Node addAtTail(int val) {
        Node dummyHead = new Node(-1);
        dummyHead.next = head;
        Node cur = dummyHead;
        while(cur.next != null){
            cur = cur.next;
        }
        Node tail = new Node(val);
        tail.next = null;
        cur.next = tail;
        size ++;
        return dummyHead.next;
    }

    public String toString(){
        String ret = "";
        Node node = head;
        while(node != null){
            ret += node.val + "->";
            node = node.next;
        }
        ret +="NULL";
        return ret;
    }

    /**
     * 删除链表中 所有值为val 的结点
     */
    public void removeAllValue(int val) {
        while (head != null && head.val == val) {//2,2,2,2极端情况
            // 头节点就是待删除节点
            Node x = head;
            head = head.next;
            x.next = null;
            size --;
        }
        // 头节点一定不是待删除的节点
        // 判空
        if (head == null) {
            // 链表删完了
            return;
        } else {
            Node prev = head;
            while (prev.next != null) {
                // 至少还有后继结点
                if (prev.next.val == val) {
                    // 此时prev.next就是待删除的结点
                    Node node = prev.next;
                    prev.next = prev.next.next;
                    node.next = null;
                    size--;
                } else {
                    // 只有当prev.next.val != val才能移动prev指针!
                    prev = prev.next;
                }
            }
        }
    }

    public static void main(String[] args) {
        MyLinkedList myLinkedList = new MyLinkedList();
        myLinkedList.addAtHead(1);
        myLinkedList.addAtTail(2);
        myLinkedList.addAtTail(2);
        myLinkedList.addAtTail(3);
        myLinkedList.addAtTail(1);
        myLinkedList.removeAllValue(2);
        System.out.println(myLinkedList);


    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值