双向链表的添加元素与删除元素

/**
 * @author Eightn0
 * @create 2021-03-13 20:36
 * 双向链表:一个字段存放数据,两个字段存放指针,一个指针指向后面的节点,另一个指针指向前面的节点
 * llink-data-rlink
 * 插入:在第一个位置插入:将新节点的右链接指向原表的第一个节点,左链接指向null
 *                     将原表第一个节点的左链接指向新节点
 *                     将原表表头指针head指向新节点
 *      在最后一个位置插入:将原表的最后一个节点的右链接指向新节点
 *                       将新节点的左链接指向原表的最后一个节点,右链接指向null
 *      在中间位置插入:记新节点左边为ptr,又被为rtr
 *                    ptr右链接指向新节点
 *                    新节点左链接指向ptr,右链接指向rtr
 *                    rtr左链接指向新节点
 * 删除:删除第一个节点:表头指针head指向下一个
 *                    新表头指针指向null
 *      删除最后一个节点:倒数第二个节点的右指针指向null
 *      删除中间节点:上一个节点的右链接指向下一个
 *                  下一个节点的左链接指向上一个
 */

class Node{
    int data;
    Node rnext;
    Node lnext;

    public Node(int data) {
        this.data = data;
        this.rnext = null; //每个节点都有左指针、右指针,默认为null,后面再赋值
        this.lnext = null;
    }
}
public class Doubly {
    private Node first;
    private Node last;

    public boolean isEmpty(){
        return first == null;
    }

    public void print(){
        Node current = first;
        while (current != null){
            System.out.println("["+current.data+"]");
            current = current.rnext;
        }
        System.out.println();
    }

    /*插入节点*/
    public void insert(Node newN){
        Node tmp;
        Node newNode;
        if (isEmpty()){
            first = newN;
            first.rnext = last;
            last = newN;
            last.lnext = first;
        }else {
            if (newN.lnext == null){//插入表头
                first.lnext = newN;//原表头左链接指向新节点
                newN.rnext = first;//新节点右指针指向原表头
                first = newN;//表头移向新指针,顺序不能乱
            }else {
                if (newN.rnext == null){//插入表尾
                    last.rnext = newN;//表尾的右链接指向新节点
                    newN.lnext = last;//新节点左链接指向原表尾
                    last = newN; //新表尾指向新节点
                }else {//插入中间
                    newNode = first;
                    tmp = first;
                    while (newN.rnext != newNode.rnext){
                        tmp = newNode;
                        newNode = newNode.rnext;//搜索过程
                    }
                    tmp.rnext = newN;//插入过程
                    newN.rnext = newNode;
                    newNode.lnext = newN;
                    newN.lnext = tmp;
                }
            }
        }
    }

    /*删除节点*/
    public void delete(Node delNode){
        Node newNode;
        Node tmp;
        if (first == null){//判断链表是否为空
            System.out.println("[表是空的]");
            return;
        }
        if (delNode == null){//判断删除条件是否存在
            System.out.println("[错误:del不是表中的节点]");
            return;
        }
        if (first.data == delNode.data){//删除表头
            first = first.rnext;//开始移向第二个节点
            first.lnext = null;//将第二个节点的左链接设置为null
        }else if (last.data == delNode.data){//删除表尾
            newNode = first;
            while (newNode.rnext != last) newNode = newNode.rnext;
            newNode.rnext = null;
            last = newNode;
        }else {//删除表的中间位置的节点
            newNode = first;
            tmp = first;
            while (newNode.data != delNode.data){
                tmp = newNode;//查找过程
                newNode = newNode.rnext;
            }
            tmp.rnext = delNode.rnext;//删除过程
            tmp.lnext = delNode.lnext;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值