链表的实现(头插、尾插、任意位置的插入、删除第一个值为key的节点、删除所有为key值的节点、查找是否包含关键字e、得到单链表的长度、将链表中的每一个节点值域拼接在一起)

一、定义一个链表

1、代码段

    public static class Node<E>{
        E value;
        Node<E> next;

        public Node(E value) {
            this.value = value;
        }
    }
    Node<E> head;   // head将来指向链表中的第一个有效节点

二、将链表用字符串的方法表示出来(将链表中的每一个节点值域拼接在一起)

    public String toString(){
        Node<E> cur=head;
        String str="[";
        while(null!=cur){
            str+=cur.value;
            if (null!=cur.next){
                str+=",";
            }
            cur=cur.next;
        }
        str+="]";
        return str;
    }

三、头插

1、思路

 2、代码段

    public void addFirst(E data){
        //创建新结点
        Node<E> node1=new Node(data);
        //判断列表是不是为空
        if(null==head){
            head=node1;
        }else{
            node1.next=head;
            head=node1;
        }
    }

四、尾插

1、思路

2、代码段

       public void addLast(E data){
        //定义一个新的结点
        Node<E> node = new Node(data);
        //插入节点
        //1.链表为空
        if (head==null){
            head=node;
        }else{
            //2.链表不为空
            Node<E> cur =head;
            while(null!=cur.next){
                cur=cur.next;
            }
            cur.next=node;
            //方法2
            /*Node cur=head;
            Node prev=null;
            while(null!=cur){
                prev=cur;
                cur=cur.next;
           }
            prev.next=node;*/
        }

五、任意位置的插入

1、思路

2、代码段

    public boolean addIndex(int position,E data){
        //1.检测测试是否合法
        if(position<0||position>=4){
            throw new IllegalArgumentException("addIndex:position非法");
        }
        if (0==position){
            addFirst(data);
            return true;
        }
        //2.找到index位置的节点,并保存其前一个
        Node<E> prev=null;
        Node<E> cur=head;
        while(0!=position){
            prev=cur;
            cur=cur.next;
            position--;
        }
        //3.插入新节点
        Node<E> node2=new Node<>(data);
        node2.next=cur;
        prev.next=node2;
        return true;

    }

六、删除第一个值为key的节点

1、思路

 

2、代码段

    //删除第一次出现关键字为key的节点
    //考虑删除的节点是头节点和非头节点
    public void remove(E e){
        Node<E> cur =head;
        Node<E> prev=null;
        //确保是一个有效的链表
        while(cur!=null){
            if(e.equals(cur.value)){
                //删除节点
                //判断节点是不是第一个节点
                cur.value=null;//让他不要指向对象
                if (null==prev){
                    //这是第一个节点
                    head=cur.next;
                }else{
                    //删除其他节点
                    prev.next=cur.next;
                }
                return;
            }
            prev=cur;
            cur=cur.next;
        }

    }

七、删除所有值为key的节点

1、代码段

   public void removeAllKey(E e) {
        Node<E> cur = head;
        Node<E> prev = null;
        while (cur != null) {
            if (e.equals(cur.value)) {
                cur.value = null;
                if(prev==null){
                    //删除
                    head = cur.next;
                    //向后遍历
                    cur=head;
                } else {
                    //删除
                prev.next = cur.next;
                //向后遍历
                cur = prev.next;
                }
            }else{//删除元素时,已经更新了cur,所以得使用else,防止再次更新漏了重复的key
            prev = cur;
            cur = cur.next;
            }
        }

    }

八、查找是否包含关键字e包含在单链表中

1、代码段

    public boolean contains(E e){
        Node<E> cur=head;
        while(null!=cur){
            if (e.equals(cur.value)){
                return true;
            }
            cur=cur.next;
        }
        return false;
    }

九、得到链表的长度

1、代码段

    public int size(){
        Node<E>cur=head;
        int count=0;
        while(null!=cur){
            count++;
            cur=cur.next;
        }
        return count;
    }

在双链表插入一个节点通常涉及以下几个步骤: 1. **创建新节点**:首先,你需要创建一个新的节点,这个节点将存储给定的 `x`。它需要有三个属性:数据域 (`data`) 存储 `x` 的,以及两个指针:一个驱 (`prev`) 指向当节点一个节点,另一个后继 (`next`) 初始时指向 `null`(如果是在列表的末插入),或者指向现有节点的后继(如果是在插入)。 2. **定位目标位置**:确定要在哪个位置插入。如果是第 `i` 个节点之后,你需要遍历链表找到第 `i-1` 个节点。这可以通过一个循环完成,从节点开始计数,直到找到指定位置一个节点。 3. **更新指针**:一旦找到第 `i-1` 节点,将新节点的 `prev` 指针设置为该节点,并将该节点的 `next` 指针设置为新节点。如果 `i` 等于 1,表示要在节点插入,那么新节点的 `next` 就直接设为节点,而节点的 `prev` 设置为新节点。 4. **插入节点**:最后,设置新节点的 `data` 属性为 `x`,并完成插入操作。 以下是伪代码形式的实现: ```python def insert_at_index(head, i, x): if i <= 0: new_node = Node(x) new_node.next = head if head is not None: head.prev = new_node return new_node current = head count = 0 while count < i - 1 and current is not None: current = current.next count += 1 if current is None: print("Invalid index") return head new_node = Node(x) new_node.prev = current new_node.next = current.next if current.next is not None: current.next.prev = new_node current.next = new_node ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值