LinkedList——链表
相比较于ArrayList的方法,除了Add(),get(),remove(),size()等,LinkedList多了addLast(),addFirst(),getFirst
1、一般将数据结构分为两大类:线性数据结构和非线性数据结构。线性数据结构有线性表、栈、队列、串、数组和文件;非线性数据结构有树和图。
线性表的逻辑结构是n个数据元素的有限序列: (a1, a2,a3,…an),n为线性表的长度(n≥0),n=0的表称为空表。数据元素呈线性关系。必存在唯一的称为“第一个”的数据元素;必存在唯一的称为“最后一个”的数据元素;除第一个元素外,每个元素都有且只有一个前驱元素;除最后一个元素外,每个元素都有且只有一个后继元素。所有数据元素在同一个线性表中必须是相同的数据类型。
线性表按其存储结构可分为顺序表和链表。用顺序存储结构存储的线性表称为顺序表;用链式存储结构存储的线性表称为链表。将线性表中的数据元素依次存放在某个存储区域中,所形成的表称为顺序表。一维数组就是用顺序方式存储的线性表。ArrayList就相当于顺序表。LinkedList就相当于链表。
2、单向链表
链表的操作
package com.wwy.linked;
public class TestLinked1 {
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Node node1 = new Node("hehe");
Node node2 = new Node("haha");
Node node3 = new Node("xixi");
Node node4 = new Node("heihei");
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = null;
System.out.println(node1.next.data);
node1.next = node4;
node4.next = node2;
System.out.println(node1.next.data);
node4.next = null;
System.out.println(node1.next.data);
}
public static class Node
{
Node next;
String data;
public Node(String s)
{
data = s;
}
}
}
就上面的例子,
3、循环链表
单向循环链表删除一个节点的例子 (节点顺序是:1--》2--》3--》4删除2节点的代码是这样的)
注意:就单向链表而言,删除一个节点必须知道该节点的前一个节点,否则无法删除(至少我现在是这样认为的)
package com.wwy.linked;
public class TestLinked2 {
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Node node1 = new Node("hehe");
Node node2 = new Node("haha");
Node node3 = new Node("xixi");
Node node4 = new Node("heihei");
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node1;
System.out.println(node1.next.data);
//删除2 注意:只能是循环链表才可以这样删除
Node temp = node2;
while (temp.next != node2) {
System.out.println("13" + temp.next.data + "||" + node2.data);
//通过循环找到2节点的前一个节点
temp = temp.next;
}
//这个时候temp是node2的前一个节点也就是node1
//把node1指向node3,相当于断开了1节点与2节点的链接
temp.next = node2.next;
//在断开2节点与3节点的链接
node2.next = null;
System.out.println(node1.next.data);
}
public static class Node
{
Node next;
String data;
public Node(String s)
{
data = s;
}
}
}
双向循环列表
下面模拟双向循环链表
package com.wwy.linked;
public class BidirectionalLinked {
/**
*