数据结构--链表(java)
2015-11-16 19:16
661 查看
链表是这样一种数据结构,其中各个对象按现行顺序排列。
数组的线性顺序是由数组下标决定的,然而与数组不同的是,链表的顺序是由各个对象的指针决定的。
链表为动态集合提供了一种简单而灵活的表示方法。
但是在java里面没有指针概念,那么我们怎么来设计链表这种数据结构呢??
首先我们用一个Node类来表示一个节点,整个链表是由多个Node对象链接起来的。
然后我们有一个LinkedList类管理这些节点。管理包括,插入节点,删除节点,搜索节点等等。
然后我们就可以在我们的 测试类或者需要使用链表的地方,新建一个链表,然后调用链表的操作,如下:
数组的线性顺序是由数组下标决定的,然而与数组不同的是,链表的顺序是由各个对象的指针决定的。
链表为动态集合提供了一种简单而灵活的表示方法。
但是在java里面没有指针概念,那么我们怎么来设计链表这种数据结构呢??
首先我们用一个Node类来表示一个节点,整个链表是由多个Node对象链接起来的。
class Node { private int data; private Node next; public Node(int data) { this.data = data; } public int getData() { return data; } public void setData(int data) { this.data = data; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } }
然后我们有一个LinkedList类管理这些节点。管理包括,插入节点,删除节点,搜索节点等等。
class SingleLink { private Node root; private int count; public void insert(int k) { } public void delete(int k){ } public Node search(int k){ return null; } public void sort(){ } public void print() { } public int size() { return count; } public boolean isEmpty() { return count == 0; } public void clean() { this.root = null; this.count = 0; } public Node get(int index) { return null } }
然后我们就可以在我们的 测试类或者需要使用链表的地方,新建一个链表,然后调用链表的操作,如下:
package com.zq.linkedlist; /** * Created by zhengshouzi on 2015/10/1. */ public class LinkedTest { public static void main(String[] args) { SingleLink singleLink = new SingleLink(); singleLink.insert(10); singleLink.insert(20); singleLink.insert(21); singleLink.insert(4); singleLink.print(); System.out.println("----------------after sort -----------------"); singleLink.sort(); singleLink.print(); singleLink.search(10); singleLink.delete(10); singleLink.print(); singleLink.search(10); singleLink.min(singleLink.getRoot()); System.out.println("size = " + singleLink.size()); System.out.println("enpty = " + singleLink.isEmpty()); System.out.println("------------------------------双向链表--------------------------------------"); DoubleLink doubleLink = new DoubleLink(); doubleLink.insert(30); doubleLink.insert(20); doubleLink.insert(21); doubleLink.insert(89); doubleLink.insert(8); doubleLink.print(); System.out.println("----------------after sort -----------------"); doubleLink.sort(); doubleLink.print(); doubleLink.search(10); doubleLink.delete(10); doubleLink.print(); doubleLink.search(10); doubleLink.min(doubleLink.getRoot()); System.out.println("size = " + doubleLink.size()); System.out.println("enpty = " + doubleLink.isEmpty()); } } //单向链表 class SingleLink { private Node root; private int count; public Node getRoot() { return root; } public void setRoot(Node root) { this.root = root; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public void insert(int data) { Node node = new Node(data); System.out.println("插入数据:" + data); if (root != null) { this.root.addNode(node); } else { this.root = node; } this.count++; } public void delete(int k) { //先查找到这个Node Node currentNode = root; Node lastNode = currentNode; while (currentNode != null && currentNode.getData() != k) { lastNode = currentNode; currentNode = currentNode.getNext(); } if (currentNode == root) { //要删除的元素是第一个,或者链表为空 if (currentNode == null) { System.out.println("链表为空"); } else { //要删除的是第一个 root = root.getNext(); System.out.println("删除表头:" + k); count--; } } else { //断开连接 System.out.println("删除:" + k); lastNode.setNext(currentNode.getNext()); count--; } } public Node search(int k) { Node currentNode = root; while (currentNode != null && currentNode.getData() != k) { currentNode = currentNode.getNext(); } if (currentNode != null) { System.out.println("找到:" + k); } else { System.out.println("没有 " + k + " 数据"); } return currentNode; } //排序,默认从小到大排列 public void sort() { Node node = root; for (int i = 1; i <= count; i++) { Node tempRoot = this.getRoot(); int j = i; while (j > 1) { tempRoot = tempRoot.getNext(); j--; } Node minNode = min(tempRoot); //交换节点值 int temp = tempRoot.getData(); tempRoot.setData(minNode.getData()); minNode.setData(temp); } } public Node min(Node root) { Node node = root; if (root != null) { int min = root.getData(); while (root != null) { if (root.getData() < min) { min = root.getData(); node = root; } root = root.getNext(); } // System.out.println("min = " + min); } return node; } public void print() { System.out.print("输出数据:"); if (this.root != null) { this.root.printNode(); } System.out.println(); } public int size() { return count; } public boolean isEmpty() { return count == 0; } public void clean() { this.root = null; this.count = 0; System.out.println("清空链表"); } public Node get(int index) { Node currentNode = root; if (index <= count && index > 0) { index--; while (currentNode != null && index > 0) { currentNode = currentNode.getNext(); index--; } } return currentNode; } private class Node { private int data; private Node next; public Node(int data) { this.data = data; } public int getData() { return data; } public void setData(int data) { this.data = data; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } public void addNode(Node newNode) { if (this.next == null) { this.next = newNode; } else { this.next.addNode(newNode); } } public void printNode() { System.out.print(this.getData() + " "); if (this.next != null) { this.next.printNode(); } } } } //双向链表 class DoubleLink { private Node root; private int count; public Node getRoot() { return root; } public void setRoot(Node root) { this.root = root; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public void insert(int data) { Node node = new Node(data); System.out.println("插入数据:" + data); if (root != null) { this.root.addNode(node); } else { this.root = node; } this.count++; } public void delete(int k) { //先查找到这个Node Node currentNode = root; while (currentNode != null && currentNode.getData() != k) { currentNode = currentNode.getNext(); } if (currentNode == root) { //要删除的元素是第一个,或者链表为空 if (currentNode == null) { System.out.println("链表为空"); } else { //要删除的是第一个 root = root.getNext(); System.out.println("删除表头:" + k); count--; } } else { if (currentNode == null) { System.out.println("没有 "+k+" 数据"); } else { //断开连接 System.out.println("删除:" + k); currentNode.getPrior().setNext(currentNode.getNext()); currentNode.getNext().setPrior(currentNode.getPrior()); count--; } } } public Node search(int k) { Node currentNode = root; while (currentNode != null && currentNode.getData() != k) { currentNode = currentNode.getNext(); } if (currentNode != null) { System.out.println("找到:" + k); } else { System.out.println("没有 " + k + " 数据"); } return currentNode; } //排序,默认从小到大排列 public void sort() { Node node = root; for (int i = 1; i <= count; i++) { Node tempRoot = this.getRoot(); int j = i; while (j > 1) { tempRoot = tempRoot.getNext(); j--; } Node minNode = min(tempRoot); //交换节点值 int temp = tempRoot.getData(); tempRoot.setData(minNode.getData()); minNode.setData(temp); } } public Node min(Node root) { Node node = root; if (root != null) { int min = root.getData(); while (root != null) { if (root.getData() < min) { min = root.getData(); node = root; } root = root.getNext(); } //System.out.println("min = " + min); } return node; } public void print() { System.out.print("输出数据:"); if (this.root != null) { this.root.printNode(); } System.out.println(); } public int size() { return count; } public boolean isEmpty() { return count == 0; } public void clean() { this.root = null; this.count = 0; System.out.println("清空链表"); } public Node get(int index) { Node currentNode = root; if (index <= count && index > 0) { index--; while (currentNode != null && index > 0) { currentNode = currentNode.getNext(); index--; } } return currentNode; } private class Node { private int data; private Node prior; private Node next; public Node getPrior() { return prior; } public void setPrior(Node prior) { this.prior = prior; } public Node(int data) { this.data = data; } public int getData() { return data; } public void setData(int data) { this.data = data; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } public void addNode(Node newNode) { if (this.next == null) { newNode.setPrior(this); this.next = newNode; } else { this.next.addNode(newNode); } } public void printNode() { System.out.print(this.getData() + " "); if (this.next != null) { this.next.printNode(); } } } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- [C/C++]反转链表
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树