Data structure-3 单链表LinkedList--Java语言实现
2017-07-20 20:53
579 查看
1. 链表特点
One disadvantage of using arrays to store data is that arrays are static structures and therefore cannot be easily extended or reduced to fit the data set. Arrays are also expensive to maintain new insertions and deletions. In this chapter we consider another data structure called Linked Lists that addresses some of the limitations of arrays.A linked list is a linear data structure where each element is a separate object.
链表是相对于数组这种数据结构存在的,弥补了数组的部分缺点,同时链表的缺点是数组的主要特点。
特点:链表是动态的数据结构,可以动态扩展,对于插入删除的开销较少。缺点是–对于数据的查找无法直接访问;且所占用内存空间相对于数组较多。
2. 单链表 Java实现
//LinkedList.java package com.fqyuan.linkedlist; /* * Version with dummy node or not. * This is one without a dummy node. */ public class LinkedList<T> { private Node head; public LinkedList() { head = new Node(); head.value = null; head.link = null; } public boolean isEmpty() { return head.value == null; } // Insert before the head node. public boolean insertAtStart(T item) { if (!isEmpty()) { Node node = new Node(); node.value = item; node.link = head; head = node; return true; } else { head.value = item; head.link = null; return true; } } // Insert after the end node. public boolean insertAtEnd(T item) { // First find the position to insert after if (!isEmpty()) { Node node = head; while (node.link != null) node = node.link; // Then 'node' is the last element of the list Node newNode = new Node(); newNode.value = item; newNode.link = null; node.link = newNode; return true; } else { head.value = item; head.link = null; return true; } } // Insert after a given position. public boolean insertAtPos(int pos, T item) { if (pos > size()) return false; /* * First find the position to insert. The position to insert will be 1 * to size. */ Node pNode = head; for (int i = 0; i < pos - 1; i++) { pNode = pNode.link; } Node qNode = pNode.link; Node newNode = new Node(); newNode.value = item; newNode.link = qNode; pNode.link = newNode; return true; } // Delete an item at a given position public boolean deleteItem(int pos) { if (pos > size()) return false; if (isEmpty()) return false; // First find the position to delete if (pos == 1) { Node pNode = head.link; head.link = null; head = pNode; return true; } if (pos == size()) { Node preNode = head; for (int i = 0; i < pos - 2; i++) { preNode = preNode.link; } preNode.link = null; return true; } Node preNode = head; for (int i = 0; i < pos - 2; i++) { preNode = preNode.link; } Node node = preNode.link; Node nextNode = node.link; preNode.link = nextNode; node.link = null; return true; } // Select sort the list public void selectSort() { for (Node p = head; p.link != null; p = p.link) { for (Node q = p.link; q != null; q = q.link) { if ((int) p.value > (int) q.value) { T temp = p.value; p.value = q.value; q.value = temp; } } } } // Bubble sort the list public void bubbleSort() { for (Node p = head; p.link != null; p = p.link) { for (Node q = head; q.link != null; q = q.link) { if ((int) q.value > (int) q.link.value) { T temp = q.value; q.value = q.link.value; q.link.value = temp; } } } } public void printList() { Node n = head; while (n != null) { System.out.print(n.value + " "); n = n.link; } System.out.println(); } public int size() { if (isEmpty()) return 0; int sz = 0; Node node = head; while (node != null) { node = node.link; sz++; } return sz; } class Node { private T value; private Node link; } } //TestLinkList.java package com.fqyuan.linkedlist; import java.util.Random; public class TestLinkList { public static void main(String[] args) { LinkedList<Integer> list = new LinkedList<Integer>(); Random random = new Random(); for (int i = 0; i < 10; i++) { int val = random.nextInt(100); System.out.print(val + " "); list.insertAtStart(val); } System.out.println(); list.printList(); System.out.println("Delete at position 1: "); list.deleteItem(1); list.printList(); System.out.println("Insert at start with value 1: "); list.insertAtStart(1); list.printList(); System.out.println("Delete at position 3: "); list.deleteItem(3); list.printList(); System.out.println("The size of the list is: " + list.size()); System.out.println("Insert at positon 3 with value 33:"); list.insertAtPos(3, 333); list.printList(); System.out.println("Delete at positon: 1"); list.deleteItem(1); list.printList(); System.out.println("Delete at position size(): "); list.deleteItem(list.size()); list.printList(); System.out.println("Insertion at end: "); list.insertAtEnd(100); list.printList(); System.out.println("Sort the array: "); list.bubbleSort(); // list.selectSort(); list.printList(); } } //Running result: 69 65 65 14 97 91 22 13 38 43 43 38 13 22 91 97 14 65 65 69 Delete at position 1: 38 13 22 91 97 14 65 65 69 Insert at start with value 1: 1 38 13 22 91 97 14 65 65 69 Delete at position 3: 1 38 22 91 97 14 65 65 69 The size of the list is: 9 Insert at positon 3 with value 33: 1 38 22 333 91 97 14 65 65 69 Delete at positon: 1 38 22 333 91 97 14 65 65 69 Delete at position size(): 38 22 333 91 97 14 65 65 Insertion at end: 38 22 333 91 97 14 65 65 100 Sort the array: 14 22 38 65 65 91 97 100 333
相关文章推荐
- Data structure-4 双向链表 DoubleLinkedList--Java语言实现
- 链表(LinkedList) Java 语言实现
- PAT1074:Reversing Linked List Java语言实现
- 数据结构(Java语言)——LinkedList简单实现
- 带有首尾的可反转链表(LinkedList)的java实现
- [java数据结构]--java双向链表LinkedList的简单实现
- 数据结构(Java语言)——LinkedList简单实现
- 链表(LinkedList) C 语言实现
- 【LeetCode-面试算法经典-Java实现】【142-Linked List Cycle II(单链表中有环II)】
- HashMap存取效率高原因、ArrayList和LinkedList区别、JAVA实现链表的基本功能
- 【LeetCode-面试算法经典-Java实现】【092-Reverse Linked List II(反转单链表II)】
- java模拟LinkedList实现双链表,完成基本操作
- java中链表的实现类LinkedList
- 【LeetCode-面试算法经典-Java实现】【141-Linked List Cycle(单链表中有环)】
- 自行实现LinkedList (链表) --Java版
- Java用LinkedList实现栈
- java数据结构之LinkedQueue(用链表实现的双端单向队列)
- java LinkedList类实现 队列
- java LinkedList类实现 队列
- java 利用 LinkedList类实现 数据结构 栈.......