链表LinkedList
链表是由若干个节点的对象组成的一种数据结构分为单链表和双链表。
- 单链表:每个节点含有一个数据和下一个节点对象的引用。
- 双链表:每个节点含有一个数据并含有上一个节点对象的引用和下一个节点对象的引用。
创建链表
使用Java.util包中的LinkedList类可以创建一个链表对象
LinkedList mylist=new LinkedList();//创建一个空双链表
可以使用add方法向链表依次增加节点
mylist.add("加入的数据");
mylist可以使用方法public Object get(index i)获取第i个节点中储存的数据。存放在节点中的数据都被看作一个Object对象。
常用方法
//向链表末尾添加一个新的结点,该结点中的数据是参数element指定的数据
public boolean add(Object element);
//向链表的指定位置添加一个新的结点,该结点中的数据是参数element指定的数据
public boolean add(int index, Object element);
//删除首次出现含有数据element的结点
public boolean remove(Object element);
//删除链表所有结点,使当前链表成为空链表
public void clear();
//删除第一个结点,并返回这个结点的数据
public Object removeFirst();
//删除最后一个结点,并返回这个结点的数据
public Object removeLast();
//将当前链表index位置结点中的数据替换为参数element指定的数据,并返回被替换的数据
public Object set(int index, Object element);
例:构造一个链表并输出节点中的数据
import java.util.*;
public class AddCode {
public static void main(String args[]){
LinkedList mylist=new LinkedList();
//链表中的第一个节点
mylist.add("你");
//链表中的第一个节点
mylist.add("好");
//获取链表的长度
int number=mylist.size();
for(int i=0;i<number;i++){
//必须强制转换取出的数据
String temp=(String)mylist.get(i);
System.out.println("第"+i+"节点中的数据:"+temp);
}
Iterator iter=mylist.iterator();
while(iter.hasNext()) {
//必须强制转换取出的数据
String te=(String)iter.next();
System.out.println(te);
}
}
}
执行结果:
PS C:\sublime text 3\java\Generics> java AddCode
第0节点中的数据:你
第1节点中的数据:好
你
好
遍历链表和get遍历链表所用时间
import java.util.*;
public class TraversalList {
public static void main(String args[]){
List<String> list = new LinkedList<String>();
for(int i = 0;i <= 60096;i++){
list.add("speed" + i);
}
Iterator<String> iter = list.iterator();
long starttime = System.currentTimeMillis();
while(iter.hasNext()){
String te = iter.next();
}
long endTime = System.currentTimeMillis();
long result = endTime - starttime;
System.out.println("使用迭代器遍历集合所用时间:" + result + "毫秒");
starttime = System.currentTimeMillis();
for(int i = 0;i < list.size();i++){
String te = list.get(i);
}
endTime = System.currentTimeMillis();
result = endTime - starttime;
System.out.println("使用get方法遍历集合所用时间:" + result + "毫秒");
}
}
执行结果:
C:\sublime text 3\java\Generics> java TraversalList
使用迭代器遍历集合所用时间:3毫秒
使用get方法遍历集合所用时间:1907毫秒
查找与排序
public static sort(list<E> list);//该方法将list中的元素按升序排序。
import java.util.*;
class Student implements Comparable {
int height = 0;
String name;
Student(String n,int h) {
name = n;
height = h;
}
public int compareTo(Object b) {
// 两个Student对象相等当且仅当二者的height值相等
Student st = (Student)b;
return (this.height - st.height);
}
}
public class SortFind {
public static void main(String args[ ]) {
List<Student> list = new LinkedList<Student>();
list.add(new Student("张三",188));
list.add(new Student("李四",178));
list.add(new Student("周五",198));
Iterator<Student> iter = list.iterator();
System.out.println("排序前,链表中的数据");
while(iter.hasNext()){
Student stu = iter.next();
System.out.println(stu.name+ "身高:" + stu.height);
}
Collections.sort(list);
System.out.println("排序后,链表中的数据");
iter = list.iterator();
while(iter.hasNext()){
Student stu = iter.next();
System.out.println(stu.name+ "身高:"+stu.height);
}
Student zhaoLin = new Student("zhao xiao lin",178);
int index = Collections.binarySearch(list,zhaoLin,null);
if(index >= 0) {
System.out.println(zhaoLin.name+"和链表中" + list.get(index).name + "身高相同");
}
}
}
执行结果:
PS C:\sublime text 3\java\Generics> javac SortFind.java
注: SortFind.java使用了未经检查或不安全的操作。
注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
PS C:\sublime text 3\java\Generics> java SortFind
排序前,链表中的数据
张三身高:188
李四身高:178
周五身高:198
排序后,链表中的数据
李四身高:178
张三身高:188
周五身高:198
赵晓琳和链表中李四身高相同
洗牌与旋转
import java.util.*;
public class ShuffleRotation {
public static void main(String args[ ]) {
List<Integer> list = new LinkedList<Integer>();
for(int i = 10;i <= 50;i = i + 10)
list.add(new Integer(i));
System.out.println("洗牌前,链表中的数据");
Iterator<Integer> iter = list.iterator();
while(iter.hasNext()){
Integer n = iter.next();
System.out.printf("%d\t",n.intValue());
}
// 将list中的数据按洗牌算法重新随机排列
Collections.shuffle(list);
System.out.printf("\n洗牌后,链表中的数据\n");
iter = list.iterator();
while(iter.hasNext()){
Integer n = iter.next();
System.out.printf("%d\t",n.intValue());
}
System.out.printf("\n再向右旋转1次后,链表中的数据\n");
// 旋转链表中的数据(当参数为正时,向右旋转;当参数为负时,向左旋转)
Collections.rotate(list,1);
iter = list.iterator();
while(iter.hasNext()){
Integer n = iter.next();
System.out.printf("%d\t",n.intValue());
}
}
}
执行结果:
C:\sublime text 3\java\Generics> javac ShuffleRotation.java
注: ShuffleRotation.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
PS C:\sublime text 3\java\Generics> java ShuffleRotation
洗牌前,链表中的数据
10 20 30 40 50
洗牌后,链表中的数据
30 50 20 40 10
再向右旋转1次后,链表中的数据
10 30 50 20 40