单链表的增删改查

  • 除了尾部添加的方式,其他的增删改都需要找到前一个节点进行操作。
  • 在有头结点的链表中,头节点不能改变。
// 定义一个链表管理节点
class SingleLinkedList {

    private Node headNode = new Node(0,"head");

    // 1、尾部添加
    public void add(Node node){
        // 由于不能修改头节点,创建临时节点
        Node temp = headNode;

        while (true){
            if(temp.next == null) break; // 当节点的下一个节点为空时,说明该节点是尾部节点
            temp = temp.next;
        }
        temp.next = node;
    }

    // 2、遍历链表
    public void list(){
        if(headNode.next == null){
            System.out.println("链表为空~");
            return;
        }
        Node temp = headNode;
        while (true){
            if(temp.next == null) break; // 节点到达最后,跳出循环
            System.out.println(temp.next);
            temp = temp.next;
        }
    }

    // 3、按顺序插入节点
    public void addByOrder(Node node){
        /**
         * 要想按顺序插入,首先需要找到插入位置的前一个节点
         * 1、头节点的next为空,直接插入
         * 2、找到中间插入位置
         * 3、链表遍历完也没找到插入位置,在最后插入
         * 4、节点已存在,插入失败
         * 1 和 3的条件是一样的,都是节点的next为空
         */
        Node temp = headNode;
        while (true){
            if(temp.next == null) break; // 说明链表为空或者已经遍历到链表尾部,直接跳出循环,在temp后添加节点即可
            if(temp.next.no > node.no){ // 按从小到大排列,temp后面的节点比插入节点的编号大,则已找到位置
                break;
            } else if(temp.next.no == node.no){
                System.out.println("节点已存在,插入失败"); //节点已存在,插入失败,直接返回
                return;
            }
            temp = temp.next;
        }
        node.next = temp.next;
        temp.next = node;
    }

    // 4、修改节点 -- 根据编号修改
    public void update(Node updateNode){
        Node temp = headNode.next;
        while (true){
            if(temp == null){
                break;
            }
            if(temp.no == updateNode.no){
                temp.value = updateNode.value;
                System.out.println("编号为" + updateNode.no + "的节点数据修改成功!");
                return;
            }
            temp = temp.next;
        }
        System.out.println("没有找到编号为" + updateNode.no + "的节点,修改失败!");
        return;
    }

    // 5、删除节点
    public void delete(Node node){
        Node temp = headNode;
        while (true){
            if(temp.next == null){
                break;
            }
            if(temp.next.no == node.no){
                temp.next = node.next;
                System.out.println("编号为" + node.no + "的节点删除成功!");
                return;
            }
            temp = temp.next;
        }
        System.out.println("没有找到编号为" + node.no + "的节点,删除失败!");
        return;
    }
}

class Node{

    public int no; // 编号
    public String value; // 节点数据
    public Node next;  // 下一个节点

    public Node(int no, String value){
        this.no = no;
        this.value = value;
    }

    @Override
    public String toString() {
        return "Node{" +
                "no=" + no +
                ", value='" + value + '\'' +
                '}';
    }
}

测试代码:

public class Test {

    public static void main(String[] args){
         // 单链表
        Node node1 = new Node(1,"liubei");
        Node node2 = new Node(2,"guanyu");
        Node node3 = new Node(3,"zhangfei");
        Node node4 = new Node(4,"machao");
        Node node5 = new Node(4,"huangzhong");
        Node node6 = new Node(5,"kongming");
        SingleLinkedList singleLinkedList = new SingleLinkedList();
        // 添加
        singleLinkedList.addByOrder(node3);
        singleLinkedList.addByOrder(node1);
        singleLinkedList.addByOrder(node4);
        singleLinkedList.addByOrder(node2);
        // 修改
        singleLinkedList.update(node6);
        // 删除
        singleLinkedList.delete(node6);
        singleLinkedList.list();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值