Java数据结构和算法

数据结构之 单向链表

2019-08-22  本文已影响0人  测试员

描述

链表是有序的列表,但是它在内存中是存储如下


单向链表.png

1)链表是以节点的方式来存储,是链式存储
2)每个节点包含 data 域, next 域:指向下一个节点.
3)如图:发现链表的各个节点不一定是连续存储.
4)链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定

代码实现

    package com.yuan.common.queue;
    
    /**
    * @author Yuan-9826
    */
    public class SingleLinkedList {
    
        private HeroNode head = new HeroNode(0, "");
    
        /**
        * 按照添加顺序增加一个节点
        *
        * @param node
        */
        public void add(HeroNode node) {
            //头结点不能动
            HeroNode temp = head;
            //一直循环直到找到尾部节点做接下来的操作
            while (temp.next != null) {
                temp = temp.next;
            }
            //找到尾部节点时 赋值
            temp.next = node;
        }
    
        /**
        * 按照头编号顺序增加一个节点
        *
        * @param node
        */
        public void addByHead(HeroNode node) {
            if (node.head == 0 || node.head <= 0) {
                throw new RuntimeException("数据不合法");
            }
            HeroNode temp = head;
            //头结点不能动
            boolean flag = false;
            while (true) {
                if (temp.next == null) {
                    //说明已经在最后面了
                    temp.next = node;
                    break;
                }
                if (temp.next.head > node.head) {
                    //位置找到就在temp后面插入
                    node.next = temp.next;
                    temp.next = node;
                    break;
    
                } else if (temp.next.head == node.head) {
                    break;
                }
                temp = temp.next;
            }
    
        }
    
        /**
        * 展示所有节点
        */
        public void show() {
            //头结点不能动
            HeroNode temp = head;
            //一直循环直到找到尾部节点
            while (temp.next != null) {
                //打印出下一个指向的节点
                System.out.println(temp.next);
                temp = temp.next;
            }
        }
    
        /**
        * 更新或增加一个节点(如果该节点存在)
        *
        * @param newNode
        */
        public void update(HeroNode newNode) {
            HeroNode temp = head;
            while (temp.next != null) {
                temp = temp.next;
                if (newNode.head == temp.head) {
                    temp.data = newNode.data;
                    return;
                }
            }
            addByHead(newNode);
        }
    
        /**
        * 删除一个节点
        *
        * @param nodeHead 节点编号
        */
        public void delete(int nodeHead) {
            HeroNode temp = head;
            while (temp != null&&null != temp.next) {
                if (temp.next.head == nodeHead) {
                    temp.next = temp.next.next;
                    return;
                }
                temp = temp.next;
            }
        }
    }
    
    class HeroNode {
        public int head;
        public String data;
        public HeroNode next;
    
        public HeroNode(int head, String data) {
            this.head = head;
            this.data = data;
        }
    
        @Override
        public String toString() {
            return "[" + "head=" + head + ", data='" + data + ']';
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读