赞
踩
有序链表:链表本身是一种无序的数据结构,元素的插入和删除不能保证顺序性,但是有没有有序的链表呢?答案是肯定的,我们在单链表中插入元素时,只需要将插入的元素与头结点及其后面的结点比较,从而找到合适的位置插入即可。一般在大多数需要使用有序数组的场合也可以使用有序链表,有序链表在插入时因为不需要移动元素,因此插入速度比数组快很多,另外链表可以扩展到全部有效的使用内存,而数组只能局限于一个固定的大小中。
有序链表的Java代码实现:
- package parking;
-
- import java.util.Random;
-
- class Node {
-
- Integer data;
- Node next;
-
- public Node(Integer data) {
- this.data = data;
- }
-
- }
-
- public class LinkOrder {
-
- private Node head;
- private int size;
-
- public LinkOrder() {
- this.head = null;
- this.size = 0;
- }
-
- // 判断是否为空
- private boolean isEmpty() {
- return head == null ? true : false;
- }
-
- // 获取链表大小
- private int getSize() {
- return size;
- }
-
- // 在链表中插入一个结点,保持链表有序性(头结点最小,尾结点最大)
- public void insert(int key) {
- Node newLink = new Node(key);
- Node previous = null;
- Node current = head;
- while (current != null && key > current.data) { // 找下个节点
- previous = current;
- current = current.next;
- }
- // 比当前节点值小,刚好插入当前节点前面
- if (previous == null) {// 链表是空的
- head = newLink;
- } else {
- previous.next = newLink;
- }
- newLink.next = current;
- size++;
- }
-
- // 返回头结点
- private Integer headNode() {
- if (head == null) {
- return null;
- }
- Integer value = head.data;
- return value;
- }
-
- // 删除头结点,并删除
- private Integer deleteHnode() {
- if (head == null) {
- return null;
- }
- Integer value = head.data;
- if (head.next == null) {
- head = null;
- } else {
- head = head.next;
- }
- size--;
- return value;
- }
-
- // 删除指定结点
- private void deleteNode(Node node) {
- if (head == null) {
- System.out.println("链表为空");
- return;
- }
-
- Node current = head;
- Node pre = null;
- while (current.data != node.data) {
- if (current.next == null) {
- System.out.println("没有找到该结点");
- return;
- }
- pre = current;
- current = current.next;
- }
- if (current == head) {
- deleteHnode();
- } else {
- pre.next = current.next;
- size--;
- }
- }
-
- // 遍历有序链表
- private void sysNode() {
- if (head == null) {
- System.out.println("该链表为空");
- }
- Node current = head;
- while (current != null) {
- System.out.print(current.data + "-->");
- current = current.next;
- }
- System.out.println();
- }
-
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- LinkOrder order = new LinkOrder();
- int i;
- Node node;
- for (i = 0; i < 5; i++) {
- order.insert(new Random().nextInt(100));
- }
- System.out.println("有序链表大小:" + order.getSize());
- order.sysNode();
- System.out.println("有序链表头结点:" + order.deleteHnode());
- order.sysNode();
- node = new Node(new Random().nextInt(100));
- System.out.println("删除指定结点:" + node.data);
- order.deleteNode(node);
- order.sysNode();
-
- }
-
- }

效果:
- 有序链表大小:5
- 44-->44-->59-->70-->71-->
- 有序链表头结点:44
- 44-->59-->70-->71-->
- 删除指定结点:59
- 44-->70-->71-->
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。