单向链表

单向链表

  链表不像数组那样,可以通过索引来获取,单向链表查找的时候必须从头开始往后一个个找,而不能从中间找,也不能从后往前找。看看下图所示的单向链表。
在这里插入图片描述

节点类代码
class MyNode {
    int data;
    MyNode next;
    String name;

    public MyNode() {
    }

    public MyNode(int data) {
        this.data = data;
    }

    public MyNode(int data, String name) {
        this.data = data;
        this.name = name;
    }

    @Override
    public String toString() {
        return "MyNode{" +
                "data=" + data +
                ", name='" + name + '\'' +
                '}';
    }
}
单向链表代码
public class MySingleLinkedList {
    // 头节点不放任何数据
    private MyNode head = new MyNode();

    // 添加到单向链表的末尾
    public void add(MyNode newNode) {
        MyNode temp = head;
        // 遍历整个单向链表,找到单向链表末尾
        while (true) {
            // 找到了单向链表的末尾
            if (temp.next == null) {
                break;
            } else { // 否则继续遍历
                temp = temp.next;
            }
        }
        // 循环结束,即找到了单向链表末尾,最后一个节点指向新节点
        temp.next = newNode;
    }

    // 按排序添加到单向链表
    public void addByOrder(MyNode newNode) {
        MyNode temp = head;
        // 遍历单向链表,找到插入位置(插入位置前一个元素)
        while (true) {
            // 找到了插入位置
            if (temp.next == null || temp.next.data > newNode.data) {
                break;
            } else { // 否则继续遍历
                temp = temp.next;
            }
        }
        // 循环结束,插入
        newNode.next = temp.next;
        temp.next = newNode;
    }

    // 修改单项链表
    public void update(MyNode myNode) {
        MyNode temp = head;
        // 判断单向链表是否为空
        if (temp.next == null) {
            System.out.println("单项链表为空");
            return;
        }
        // 找需要修改的节点
        while (true) {
            if (temp.next == null) {
                System.out.println("单项链表没有节点 " + myNode);
                break;
            }
            if (temp.next.data == myNode.data) {
                temp.next.name = myNode.name;
                break;
            }
            temp = temp.next;
        }
    }

    // 删除节点
    public void remove(int id) {
        MyNode temp = head;
        // 判断单向链表是否为空
        if (temp.next == null) {
            System.out.println("单项链表为空");
            return;
        }
        // 找到data为id的节点
        while (true) {
            if (temp.next == null) {
                System.out.println("没有该节点");
                break;
            }
            // 删除节点
            if (temp.next.data == id) {
                temp.next = temp.next.next;
                break;
            }
            temp = temp.next;
        }
    }

    // 打印单向链表
    public void print() {
        // 判断单向链表是否为空
        if (head.next == null) {
            System.out.println("单项链表为空");
            return;
        }
        MyNode temp = head.next;
        while (true) {
            // 遍历结束则退出
            if (temp == null) {
                break;
            }
            // 输出节点信息
            System.out.println(temp);
            temp = temp.next;
        }
    }
    
}

测试一下

public static void main(String[] args) {
    MySingleLinkedList mySingleLinkedList = new MySingleLinkedList();
    System.out.println("----------------------添加----------------------");
    mySingleLinkedList.add(new MyNode(1, "Tom"));
    mySingleLinkedList.add(new MyNode(3, "Jone"));
    mySingleLinkedList.addByOrder(new MyNode(2, "kiss"));
    mySingleLinkedList.addByOrder(new MyNode(4, "Keb"));
    mySingleLinkedList.print();

    System.out.println("----------------------修改----------------------");
    mySingleLinkedList.update(new MyNode(3, "Hul"));
    mySingleLinkedList.print();
    mySingleLinkedList.update(new MyNode(5, "Yke"));

    System.out.println("----------------------删除----------------------");
    mySingleLinkedList.remove(4);
    mySingleLinkedList.print();
}

运行结果

----------------------添加----------------------
MyNode{data=1, name='Tom'}
MyNode{data=2, name='kiss'}
MyNode{data=3, name='Jone'}
MyNode{data=4, name='Keb'}
----------------------修改----------------------
MyNode{data=1, name='Tom'}
MyNode{data=2, name='kiss'}
MyNode{data=3, name='Hul'}
MyNode{data=4, name='Keb'}
单项链表没有节点 MyNode{data=5, name='Yke'}
----------------------删除----------------------
MyNode{data=1, name='Tom'}
MyNode{data=2, name='kiss'}
MyNode{data=3, name='Hul'}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值