List容器——LinkedList及常用API,实现栈和队列

LinkedList及常用API

①   LinkedList----链表

②   LinkedList类扩展AbstractSequentialList并实现List接口

③   LinkedList提供了一个链表数据结构

④   LinkedList有两个构造方法

a)   LinkedList()

b)   LinkedList(Collection c)

⑤   除了继承的方法之外,LinkedList类还定义了一些有用的方法用于操作和访问容器中的数据;

a)   void addFirst(E e)

b)   void addLast(E e)

c)    E removeFirst()

d)    E removeLast()

 1 LinkedList<String> sList = new LinkedList<String>();
 2         sList.add("zhangsan");// 将指定元素添加到此列表的结尾
 3         sList.add("lisi");
 4         sList.add("wangwu");
 5         sList.add("rose");
 6         sList.add("mary");
 7         sList.add("jack");
 8         sList.addFirst("jay");// 将指定元素插入此列表的开头
 9         sList.addLast("jhon");// 将指定元素添加到此列表的结尾
10         for (String name : sList) {
11             System.out.println(name);
12         }
13
14         System.out.println("****************************************");
15         System.out.println(sList.removeFirst());//移除并返回此列表的第一个元素;如果此列表为空,NoSuchElementException
16         sList.clear();
17         System.out.println(sList.size());//返回此列表的元素数
18         System.out.println(sList.pollFirst());//获取并移除此列表的第一个元素;如果此列表为空,则返回 null

Linked中链表结构如下:

LinkedList中的 remove(Object)方法如下:

 1  public boolean remove(Object o) {
 2         if (o == null) {
 3             for (Node<E> x = first; x != null; x = x.next) {
 4                 if (x.item == null) {
 5                     unlink(x);
 6                     return true;
 7                 }
 8             }
 9         } else {
10             for (Node<E> x = first; x != null; x = x.next) {
11                 if (o.equals(x.item)) {
12                     unlink(x);
13                     return true;
14                 }
15             }
16         }
17         return false;
18     }

再找到unlink方法

 1 E unlink(Node<E> x) {
 2         // assert x != null;
 3         final E element = x.item;
 4         final Node<E> next = x.next;
 5         final Node<E> prev = x.prev;
 6
 7         if (prev == null) {
 8             first = next;
 9         } else {
10             prev.next = next;
11             x.prev = null;
12         }
13
14         if (next == null) {
15             last = prev;
16         } else {
17             next.prev = prev;
18             x.next = null;
19         }
20
21         x.item = null;
22         size--;
23         modCount++;
24         return element;
25 }

从中可以看到删除时做的操作是,将要删除的元素b设为null,并且将其上一个元素a指向b的下一个元素c,将c指向a;

总结:

内部封装的是双向链表数据结构

每个节点是一个Node对象,Node对象中封装的是你要添加的元素

还有一个指向上一个Node对象的引用和指向下一个Node对象的引用

不同的容器有不同的数据结构,不同的数据结构操作起来性能是不同的

链表数据结构,做插入,删除的效率比较高,但查询效率比较低

数组结构,它做查询的效率高,因为可以通过下标直接找到元素

但插入删除效率比较低,因为要做移位操作

二:用LinkedList实现栈和队列

栈的特点,后进先出

栈的方法:

 1 class MyStack<T>{
 2     private LinkedList<T> data=null;
 3     public MyStack() {
 4         data=new LinkedList<T>();
 5     }
 6
 7     //压栈的方法
 8     public void push(T obj) {
 9         data.addFirst(obj);
10     }
11
12     public T pop() {
13         return data.removeFirst();
14     }
15
16     public  Iterator<T> iterator() {
17         return data.iterator();
18     }
19 }

main函数中添加及使用:

 1 MyStack<String> mystack=new MyStack<String>();
 2         mystack.push("zhangsan");
 3         mystack.push("lisi");
 4         mystack.push("wangwu");
 5         mystack.push("zhaoliu");
 6         mystack.pop();
 7         mystack.pop();
 8          Iterator<String> it=mystack.iterator();
 9          while(it.hasNext()){
10              System.out.println(it.next());
11          }

输出结果:

lisi

zhangsan

队列的特点:先进先出

队列的方法:

 1 class myQueue<T>{
 2     private LinkedList<T> data=null;
 3     public myQueue(){
 4         data=new LinkedList<T>();
 5     }
 6
 7     public void push(T obj) {
 8         data.addFirst(obj);
 9     }
10
11     public T pop() {
12         return data.removeLast();
13     }
14
15     public Iterator<T> iterotor() {
16         return data.iterator();
17     }
18 }

main函数中添加及使用:

 1 myQueue<Integer> myQueue=new myQueue<Integer>();
 2         myQueue.push(1);
 3         myQueue.push(2);
 4         myQueue.push(3);
 5         myQueue.push(4);
 6         myQueue.push(5);
 7         myQueue.pop();
 8         myQueue.pop();
 9         Iterator<Integer> it= myQueue.iterotor();
10         while (it.hasNext()) {
11             System.out.println(it.next());
12         }

输出结果:

5

4

3

时间: 2024-12-14 04:36:11

List容器——LinkedList及常用API,实现栈和队列的相关文章

List容器——ArrayList及常用API

List: ①   List容器是有序的collection(也称为序列).此接口的用户可以对List容器中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素.List容器允许插入重复的值,包括null; ②   最常见的两个List接口的实现类是ArrayList和LinkedList; ArrayList及常用API: ①   ArrayList—动态数组; ②   ArrayList类扩展了AbstractList并实现了List接口

Map容器——TreeMap及常用API,Comparator和Comparable接口

TreeMap及常用API ①   TreeMap类通过使用红黑树实现Map接口; ②   TreeMap提供按排序顺序存储键/值对的有效手段,同时允许快速检索; ③   不像散列(HashMap),树映射保证它的元素按关键字升序排序; ④   TreeMap构造方法: a)   TreeMap() b)   TreeMap(Comparator comp) c)   TreeMap(Map m) d)   TreeMap(SortedMap sm) ⑤   TreeMap实现SortedMap

Map容器——HashMap及常用API,及put,get方法解析,哈希码的产生和使用

Map接口 ①   映射(map)是一个存储键/值对的对象.给定一个键,可以查询到它的值,键和值都是对象; ②   键必须是唯一的,值可以重复; ③   有些映射可以接收null键和null值,而有的不行; ④   下面的接口可以支持映射: 接口 描述 Map 映射唯一关键字给值 Map.Entry 描述映射中的元素(关键字/值对).这是Map的一个内部类 SortedMap 扩展Map以便关键字按升序保持 ⑤   Map接口映射唯一键到值; ⑥   键(key)是以后用于检索值的对象.给定一个

Java学习笔记(Javase毕向东版视频)五 常用API对象一

常用API:字符串操作:String类,StringBuffer类,StringBulider类 字符串是最重要的数据类型之一,处理字符串也是一种语言的基本工作. 1.String类: 1 public class StringDemo { 2 public static void main(String[] args) 3 { 4 StringDemo1(); 5 } 6 protected static void StringDemo1() 7 { 8 /*java中有两种创建String对

STL vector常用API

1.容器:序列容器(时间决定).关联式容器(容器中的数据有一定规则) 2.迭代器:通过迭代器寻找.遍历容器中的数据 vetor的使用:数据遍历与输出 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> //向量 动态数组 #include<algorithm> //算法头文件 #include<string> using namespace std; void myPrint

传智Java常用API知识测试

常用API部分 共40道选择题,每题2.5分.31-40是多选题,多选题有错则全错,全对才满分. String类中的getBytes()方法的作用是(     )C a)     将整数变成字符串 b)     将字符串变成字符数组 c)     将字符串变成字节数组 d)     获取中字符串中字符的个数 对字符串”ababcdabcdefg” 使用indexOf(‘a’)和lastIndexOf(‘a’),的运行结果是(     )B a)     1,1 b)     0,6 c)    

Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API

不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权限修饰符,默认访问, 类,方法,成员变量 private 权限修饰符,私有访问, 方法,成员变量 static 静态修饰符 方法,成员变量 final 最终修饰符 类,方法,成员变量,局部变量 abstract 抽象修饰符 类 ,方法 我们编写程序时,权限修饰符一般放于所有修饰符之前,不同的权限修饰

【Android】深入掌握自定义LayoutManager(一) 系列开篇 常见误区、问题、注意事项,常用API。

转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52948009 本文出自:[张旭童的博客] 本系列文章相关代码传送门: 自定义LayoutManager实现的流式布局 欢迎star,pr,issue. 本系列文章目录: 深入掌握自定义LayoutManager(一) 系列开篇 常见误区.问题.注意事项,常用API. 深入掌握自定义LayoutManager(二) 实现流式布局(creating) 概述 这篇文章是深入掌握自定义Layo

【常用算法思路分析系列】栈和队列高频题集(修改版)

本文是[常用算法思路分析系列]的第三篇,分析栈和队列相关的高频题目.本文分析:1.可查询最值的栈:2.用两个栈实现队列的功能:3.反转栈中元素:4.排序栈中元素:5.滑动窗口问题. 本系列前两篇导航: [常用算法思路分析系列]排序高频题集 [常用算法思路分析系列]字符串高频题集 1.可查询最值的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 思路: 定义两个栈stackData和stackMin,其中stackData用来存放进栈的数据,stackMin用来存放进栈过