链表的组成:链表头+结点
链表头一般只存储下一个节点的引用
节点:存数据+下一个节点的引用
链表头代码:
package com.xingej.algorithm.datastructure.linkedList.singleLinkedList; /** * 声明一个链表的头部 * * 从链表头的使用,联想到hadoop,spark,netty中都有上下文context * * @author erjun 2017年12月8日 上午8:45:08 */ public class LinkList { private Node first; public LinkList() { // 初始链表时,指针引用为空 first = null; } public void insertFirst(int iData, double dData) { // 创建一个新的链节点 Node newLink = new Node(iData, dData); // 更新新创建的链节点next引用,也就是将头部引用,赋值给它 newLink.next = first; // 更新链表头部的引用, 也就是将新创建的链节点的引用,赋值给头部引用 first = newLink; } public boolean isEmpty() { return null == first; } public Node deleteFirst() { // 先缓存 被删除的第一个元素 Node temp = first; // 链表,这种数据结构里,删除元素,只需要更新指针引用就可以了 // 更新头部元素的引用 first = first.next; return temp; } public void displayList() { System.out.println("List (first--->last):"); Node current = first; while (null != current) { current.displayLink(); // 获取下一个元素的引用, 在C语言里,称为指针 current = current.next; } System.out.println(); } }
节点代码:
package com.xingej.algorithm.datastructure.linkedList.singleLinkedList; /** * 声明一个节点 * * @author erjun 2017年12月8日 上午8:41:50 */ public class Node { private int iData; private double dData; // 不是private 哦,不然对象访问不了 public Node next; public Node(int iData, double dData) { this.dData = dData; this.iData = iData; } public void displayLink() { System.out.println("{" + iData + ", " + dData + "}"); } }
简单测试用例:
package com.xingej.algorithm.datastructure.linkedList.singleLinkedList; import org.junit.Test; /** * 单链表测试 * * @author erjun 2017年12月8日 上午9:00:54 */ public class LinkListTest { @Test public void test() { LinkList list = new LinkList(); // 很明显,每次都是插入链表的第一个元素 list.insertFirst(32, 8); list.insertFirst(3, 3); list.insertFirst(2, 6); list.insertFirst(42, 8); list.insertFirst(26, 9); list.displayList(); } }