LinkedList
LinkedList特有的方法:
1、方法介绍:
addFirst(E e):把元素添加到集合的首位置上
addLast(E e):把元素添加到集合的末尾处
getFirst():获取集合中首位置的元素
getLast():获取集合中末尾处的元素
removeFirst():删除集合中的首位置元素并返回
removeLast():删除集合中的末尾元素并返回
如果集合中没有元素,获取或者删除元素抛:NoSuchElementException
public class Demo1 {
public static void main(String[] args){
LinkedList list = new LinkedList();
list.add("小三");
list.add("小四");
list.add("小五");
list.addFirst("小六");
list.addLast("小七");
System.out.println("集合的元素:"+list);
System.out.println("获取集合中首位置的元素:"+list.getFirst());
System.out.println("获取集合中末尾处的元素:"+list.getLast());
System.out.println("删除集合中首位置的元素并返回:"+list.removeFirst());
System.out.println("删除集合中末尾处的元素并返回:"+list.removeLast());
System.out.println("集合的元素:"+list);
}
}
2、数据结构:
1、栈:先进后出
push()
pop()
2、队列:先进先出
offer()
poll()
3、返回逆序的迭代器对象
descendingIterator():返回逆序的迭代器对象
public class Demo2 {
public static void main(String[] args){
LinkedList list = new LinkedList();
list.add("小一");
list.add("小二");
list.add("小三");
list.push("小狗");//将该元素插入到集合的开头
System.out.println("删除集合中的首元素并返回:"+list.pop());
list.offer("小胜");
System.out.println("删除集合中的首元素并返回:"+list.poll());
Iterator it = list.descendingIterator();
while(it.hasNext()){
System.out.println(it.next()+",");
}
System.out.println();
System.out.println("集合的元素:"+list);
}
}
练习1:使用LinkedList实现堆栈数据结构的存储方式和队列数据结构的存储方式。
class Stack{
LinkedList list;
public Stack(){
list = new LinkedList();
}
//压栈
public void add(Object obj){
list.push(obj);
}
//弹栈
public Object pop(){
Object obj = list.pop();
return obj;
}
//获取元素的个数
public int size(){
return list.size();
}
}
class Queue{
LinkedList list;
public Queue(){
list = new LinkedList();
}
//入队
public void add(Object obj){
list.offer(obj);
}
//出队
public Object remove(){
return list.poll();
}
//获取元素个数
public int size(){
return list.size();
}
}
public class Demo3 {
public static void main(String[] args){
Stack stack = new Stack();
stack.add("小三");
stack.add("小四");
stack.add("小五");
System.out.println("栈的元素个数:"+stack.size());
// System.out.println("集合元素:"+stack.pop()); //小五,后进先出
int size = stack.size();
for(int i=0; i<size; i++){//为什么只输出了小五小四,因为在循环弹栈的过程中,stack.size也在变化
System.out.print(stack.pop()+" ");
}
System.out.println();
Queue queue = new Queue();
queue.add("小六");
queue.add("小七");
queue.add("小八");
System.out.println("队列的元素个数:"+queue.size());
// System.out.println(queue.remove()); //小六 先进先出
int qsize = queue.size();
for(int i=0; i<size; i++){
System.out.print(queue.remove()+" ");
}
}
}
练习2:使用LinkedList存储一副扑克牌并实现洗牌功能
LinkedList:增删快,查找慢
class Poker{
//扑克牌的牌数
public static final int SUM = 52;
//扑克牌的花色
String color;
//扑克牌的点数
String num;
public Poker(String color, String num){
this.color = color;
this.num = num;
}
public String toString(){
return "{花色:"+this.color+" 点数:"+this.num+"}";
}
}
public class Demo4 {
//创建扑克牌
public static LinkedList createPeker(){
//创建LinkedList对象存储扑克牌
LinkedList list = new LinkedList();
//定义扑克牌的花色
String[] colors = {"红桃", "方块", "黑桃", "梅花"};
//定义扑克牌的点数
String[] nums = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
//将扑克牌加入到list中
for(int i=0; i<colors.length; i++){
for(int j=0; j<nums.length; j++){
list.add(new Poker(colors[i], nums[j]));
}
}
return list;
}
//显示扑克牌
public static void showPoker(LinkedList list){
// Iterator it = list.iterator();
// while(it.hasNext()){
// Poker poker = (Poker)it.next();
// System.out.print(poker + " ");
// }
for(int i=0; i<list.size(); i++){
Poker poker = (Poker)list.get(i);
System.out.print(poker + " ");
if(i%13 == 12){ //每13个一换行,也可以((i+1)%13 == 0)
System.out.println();
}
}
}
//洗牌方式1:建立一个新集合,不断从旧集合随机取出一张扑克牌加入到新集合中,完成洗牌
public static LinkedList shufflePoker1(LinkedList list){
Random random = new Random();
int size = list.size();
LinkedList newList = new LinkedList();
for(int i=0; i<size; i++){
int pokerNum = random.nextInt(list.size());
newList.add(list.get(pokerNum));
list.remove(pokerNum);
}
return newList;
}
//洗牌方式2:随机获取两个索引值,然后交换索引值处的元素,交换多次之后完成洗牌
public static void shufflePoker2(LinkedList list){
Random random = new Random();
for(int i=0; i<100; i++){
int index1 = random.nextInt(list.size());
int index2 = random.nextInt(list.size());
Poker poker1 = (Poker)list.get(index1);
Poker poker2 = (Poker)list.get(index2);
list.set(index1, poker2);
list.set(index2, poker1);
}
}
public static void main(String[] args){
//1.创建扑克牌
LinkedList pokers = createPeker();
//2.显示扑克牌
showPoker(pokers);
//3.方式1洗牌
//LinkedList shufflePoker = shufflePoker1(pokers);
//System.out.println("洗牌之后的扑克牌:");
//showPoker(shufflePoker);
//4.方式2洗牌
shufflePoker2(pokers);
System.out.println("洗牌之后的扑克牌:");
showPoker(pokers);
}
}
练习3:根据人的年龄进行排序存储
class Person{
public int age;
public String name;
public Person(int age, String name){
this.age = age;
this.name = name;
}
public String toString(){
return "[年龄:"+this.age+" 姓名:"+this.name+"]";
}
}
public class Demo5 {
//排序1:直接排序(从小到大)
public static LinkedList sortAge1(LinkedList list){
int len = list.size();
for(int i=0; i<len; i++){
for(int j=i+1; j<len; j++){
Person p1 = (Person)list.get(i);
Person p2 = (Person)list.get(j);
if(p1.age > p2.age){
//交换位置可以用集合中的set(int index, Object obj)
list.set(i, p2);
list.set(j, p1);
}
}
}
return list;
}
//排序2:冒泡排序(从大到小)
public static LinkedList sortAge2(LinkedList list){
int len = list.size();
for(int i=0; i<len-1; i++){ //进行的轮数
for(int j=0; j<len-i-1; j++){
Person p1 = (Person)list.get(j);
Person p2 = (Person)list.get((j+1));
if(p1.age < p2.age){
list.set(j, p2);
list.set(j+1, p1);
}
}
}
return list;
}
//排序3:冒泡排序(优化版1)
public static void bubbleSort(int[] array){
int len = array.length;
for(int i=0; i<len-1; i++){
boolean isSorted = true;
for(int j=0; j<len-i-1; j++){
int temp = 0;
if(array[j]>array[j+1]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
isSorted = false;
}
}
if(isSorted){ //只要上一轮没有比较(也就是说上一轮isSort没有变成false,说明剩下的元素都已经有序了,可以直接break退出循环)
break;
}
}
}
//排序4:冒泡排序(优化版2)
public static void bubbleSort2(int[] array){
//无序数列的边界,每次比较只需要比到这里为止,
int sortBorder = array.length - 1;
//记录最后一次交换的位置
int lastExchangeIndex = 0;
for(int i=0; i<array.length; i++){
boolean isSorted = true;
for(int j=0; j<sortBorder; j++){
int temp = 0;
if(array[j]>array[j+1]){
temp = array[j];
array[j+1] = array[j];
array[j] = temp;
isSorted = false;
//记录最后一次交换元素的位置
lastExchangeIndex = j;
}
}
sortBorder = lastExchangeIndex;
if(isSorted){
break;
}
}
}
public static void main(String[] args){
LinkedList list = new LinkedList();
list.add(new Person(24, "壮年"));
list.add(new Person(18, "成年"));
list.add(new Person(100, "老年"));
list.add(new Person(38, "中年"));
list.add(new Person(13, "少年"));
// sortAge1(list);
sortAge2(list);
for(int i=0; i<list.size(); i++){
Person p = (Person)list.get(i);
System.out.print(p+" ");
}
System.out.println();
}
}