首页 > 其他 > 详细

单链表之升级版按节点序号添加

时间:2020-01-02 23:41:32      阅读:104      评论:0      收藏:0      [点我收藏+]

该示例的代码是在前一篇的基础上进行修改的.

 

public class SingleLinkedListDemo {
    public static void main(String[] args) {
        //先创建几个节点
        Node node1 = new Node(1, "老子", "太上老君");
        Node node2 = new Node(2, "王达", "玉皇大帝");
        Node node3 = new Node(3, "萧炎", "炎帝");
//        Node node4 = new Node(3, "萧炎", "炎帝");
        SingleLinkedList linkedList = new SingleLinkedList();
        // 调用顺序添加的方法,请注意添加顺序1,3,2
        linkedList.orderAdd(node1);
        linkedList.orderAdd(node3);
        linkedList.orderAdd(node2);
//        linkedList.orderAdd(node4);
        linkedList.list(); //打印
    }
}

/**
 * 定义一个链表,用于管理每个Node节点
 */
class SingleLinkedList {
    // 初始化一个头节点, 不能动,用于去找链表的其它节点
    private Node head = new Node(0);

    //添加节点到单向链表尾部
    public void add(Node node) {
        // 1. 如何找到链表的尾节点
        Node temp = head;
        //遍历链表,找到最后的节点
        while (true) {
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
        }
        // 当退出while循环时, temp指向了链表的最后
        temp.next = node;
    }

    /**
     * 按照no编号进行添加 . 如no=3,那么它应该加在no=2节点之后,如果有no=3的节点,报错提示
     *
     * @param node
     */
    public void orderAdd(Node node) {
        // 因为head节点不能动,所以需要使用一个辅助节点
        // 而且这个temp节点一定是添加节点的前一个节点
        Node temp = head;
        // 标识添加的编号是否存在
        boolean flag = false;
        //遍历链表,找到最后的节点
        while (true) {
            if (temp.next == null) {  // 说明temp是尾节点
                break;
            }
            /*
             注意: 这儿为啥不使用temp.no < node.no是判断吗? 
             假设temp.no =1, 现在添加2,  1<2,所以将2节点放到1点后面,
             再添加3, 因为是从head节点开始遍历,所以1<3 , 所以将3节点添加到1点后面,
             正确的是遍历到2号节点, 2<3, 添加到2号节点后面.但谁让从head节点开始遍历,1比2先出现呢...
            */
            if (temp.next.no > node.no) {// 找到正确的节点编号了
                break;
            } else if (temp.next.no == node.no) {  // 说明编号存在
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {  // 不能添加 ,编号已经存在
            System.out.printf("%d已经存在 ,不能添加!\n", node.no);
        } else {
            // 插入到链表中
            node.next = temp.next;
            temp.next = node;

        }

    }

    public void list() {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }

        Node temp = head.next;
        while (true) {
            // 判断是否到链表最后
            if (temp == null) {
                break;
            }
            // 打印
            System.out.println(temp);
            temp = temp.next;
        }

    }

}

class Node {
    int no;
    String name;
    String nickName;
    /**
     * 指向下一个节点
     */
    public Node next;

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

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

    @Override
    public String toString() {
        return "Node{" +
                "no=" + no +
                ", name=‘" + name + ‘\‘‘ +
                ", nickName=‘" + nickName +
                ‘}‘;
    }
}

打印结果

Node{no=1, name=‘老子‘, nickName=‘太上老君}
Node{no=2, name=‘王达‘, nickName=‘玉皇大帝}
Node{no=3, name=‘萧炎‘, nickName=‘炎帝}

搞定收工!

单链表之升级版按节点序号添加

原文:https://www.cnblogs.com/z-qinfeng/p/12142767.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!