1、简介
使用数组来存储数据的一个缺点是,数组是静态的结构,因此 不能被容易的扩展或减少数据集。维护新数组也贵 插入和删除。 在这一章里,我们考虑另一个名为链表的数据结构 地址的一些局限性数组。
一个链表是一个线性数据结构,其中每个元素是一个单独的 对象。
每个元素(我们叫它节点的两个项目——组成的列表 数据和到下一个节点的引用。 最后一个节点的引用null。 入口点到链表称为头的列表。 应该注意,头 不是一个单独的节点,而是第一个节点的引用。 如果列表为空,那么是一个主管 空引用。
一个链表是一个动态的数据结构。 列表中的节点的数目是不固定的,可以生长 对需求和收缩。 任何应用程序的处理需要数量未知的对象 使用链表。
对数组链表的一个缺点是它不允许 直接访问单个元素。 如果你想访问一个特定的项目 你必须从头部开始,遵循项目的引用,直到你到达。
另一个缺点是,链表使用更多的内存与——我们额外的数组 4个字节(32位CPU)存储到下一个节点的引用。
2、链表分类
链表分类
单链表 | 可以通过后驱找到后续节点 |
双链表 | 有前驱和后驱,可以找到前驱结点和后继结点 |
循环链表 | 最后一个节点的后驱是第一个节点 |
3、构造方法
构造一个空列表。 |
|
4、方法摘要
|
|
void |
|
|
|
boolean |
|
void |
|
void |
|
| |
|
|
boolean |
|
|
|
| |
| |
| |
| |
int |
|
int |
|
| |
boolean |
|
boolean |
|
boolean |
|
| |
| |
| |
| |
| |
| |
| |
void |
|
| |
| |
| |
| |
boolean |
|
| |
boolean |
|
| |
int |
|
|
|
| |
12 | 12 |
|
5、部分代码
1、添加、获取、删除、遍历
public class TestLinkedList {
public static void main(String[] args) {
LinkedList<String> books = new LinkedList();
// 把元素添加到列表的结尾
books.add("A");
books.add("B");
books.add("C");
// 把元素添加到列表的第一个位置
books.addFirst("1");
// 把元素添加到列表的最后一个位置
books.addLast("8");
// 把元素添加到列表的最后一个位置
books.offer("X");
// 把元素添加到列表的第一个位置
books.offerFirst("0");
// 把元素添加到列表的最后一个位置
books.offerLast("9");
// 遍历方法一
Iterator<String> iter = books.iterator();
while (iter.hasNext()) {
String element = iter.next();
System.out.print(element);
}
// 输出 :01ABC8X9
// 遍历方法二
for (String str : books) {
System.out.print(str);
}
// 输出 :01ABC8X9
// 获取链表的第一个元素,并且不移除
// 方法一
System.out.println(books.getFirst());
// 方法二
System.out.println(books.element());
// 方法三
System.out.println(books.peek());
// 方法四
System.out.println(books.peekFirst());
// 获取第一个元素并且移除
// 方法一
System.out.println(books.poll());
// 方法二
System.out.println(books.pollFirst());
// 方法三
System.out.println(books.remove());
// 方法四
System.out.println(books.removeFirst());
// 遍历方法三,到序遍历
iter = books.descendingIterator();
while (iter.hasNext()) {
String element = iter.next();
System.out.print(element);
}
// 获取子链表
System.out.println(books.subList(0, 2));
// 删除指定位置的元素
books.subList(0, 2).clear();
for (String str : books) {
System.out.print(str);
}
}
}
2、实现栈的效果
public class TestLinkedListandSXtack {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MyStacks ms = new MyStacks();
//入栈
ms.Push("A");
ms.Push("B");
ms.Push("C");
//LinkedList 转 ArrayList
ms.Show();
//获取栈顶元素
System.out.println(ms.Top());
//连续出栈
System.out.println(ms.Pop());
System.out.println(ms.Pop());
System.out.println(ms.Pop());
}
}
class MyStacks
{
private LinkedList<Object> list = new LinkedList<Object>();
public void Show(){
//LinkedList 转 ArrayList
ArrayList<Object> ay = new ArrayList<Object>(list);
for(Object str:ay){
System.out.print(str);
}
System.out.println();
}
//获取栈顶元素
public Object Top(){
return list.getFirst();//list.element();
}
//入栈
public void Push(Object o){
list.addFirst(o);
}
//出栈
public Object Pop(){
return list.remove();
}
}
3、实现队列的效果
<p><span style="font-weight: normal;">package com.jlz;
import java.util.*;
public class TestLinkedListAndQueue {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MyQueue queue = new MyQueue();
queue.Put("A");
queue.Put("B");
queue.Put("C");
while(!queue.isEmpty()){
System.out.print(queue.Get());
}
}
}
class MyQueue
{
LinkedList<Object> list = new LinkedList<Object>();
//入队列,添加到队尾
public void Put(Object o){
list.addLast(o);
}
//出队列
public Object Get(){
return list.removeFirst();
}
//判断是否为空
boolean isEmpty(){
return list.isEmpty();
}
}
</span></p>
4、转换为数组(长度为0,长度为链表长度)、转换为ArrayList
package com.jlz;
import java.util.*;
public class LinkedListChangeIndex {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList<String> list = new LinkedList<String>();
list.add("A");
list.add("B");
list.add("C");
//转为数组,数组长度为0
String str[] = list.toArray(new String[0]);
for(String s:str){
System.out.print(s);
}
//转为数组,数组长度为链表长度
String string[] = list.toArray(new String[list.size()]);
for(String s:string){
System.out.print(s);
}
//转为ArrayList
ArrayList<String> alist = new ArrayList<String>(list);
for(Object o:alist){
System.out.print(o);
}
}
}
5、同步
package com.jlz;
import java.util.*;
public class LinkedListStackSynchronized {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList<Object> stack = new LinkedList<Object>();
stack.addFirst("A");
stack.addFirst("B");
stack.addFirst("C");
//同步
stack = (LinkedList<Object>)Collections.synchronizedList(stack);
}
}