1.链表
1.概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。
头指针:
(1)标识链表,即链表的名字;
(2)存储链表中的第一个结点的地址。
尾指针:
尾指针即链表的最后一个结点,没有后继,因此指针域必须置空,即NULL。
2.java实现链表
public class LinkedArray<T> {
//内部类
private class Node<T>{
T ele;
Node next;
public Node(T ele){
this.ele = ele;
this.next = null;
}
public Node(){
this(null);
}
public Node(T ele,Node next){
this.ele = null;
this.next = null;
}
@Override
public String toString(){
return this.ele.toString();
}
}
//链表长度
private int size;
//虚拟头结点
private Node dummyHead;
//获得链表长度
public int getSize(){
return size;
}
//判断链表是否为空
public boolean isEmpty(){
return size == 0;
}
public LinkedArray(){
this.size = 0;
this.dummyHead = new Node(null,null);
}
//向链表头部添加元素
public void addHead(T ele) throws IllegalAccessException {
//add(ele,0);
Node node = new Node(ele);
if(node == null){
throw new IllegalAccessException("节点为空");
}
node.next = dummyHead.next;
dummyHead.next = node;
size++;
}
public void add(T ele,int index) throws IllegalAccessException{
Node node = new Node(ele);
if(node == null){
throw new IllegalAccessException("结点为空");
}
if(index<0 || index>size){
throw new IllegalAccessException("索引越界!");
}
Node prev = dummyHead;
for(int i=0;i<index;i++){
prev = prev.next;
}
//插入操作
node.next = prev.next;
prev.next = node;
size++;
}
public void addTail(T ele) throws IllegalAccessException{
//add(ele,size);
Node node = new Node(ele);
if(node == null){
throw new IllegalAccessException("节点为空");
}
Node prev = dummyHead;
for(int i=0;i<size;i++){
prev = prev.next;
}
prev.next = node;
size++;
}
//获取头节点元素
public T getHead() throws IllegalAccessException{
return get(0);
}
//获取最后一个元素
public T getTail() throws IllegalAccessException{
return get(size-1);
}
//获取任意位置上的元素
public T get(int index) throws IllegalAccessException{
if(index<0 || index>=size){
throw new IllegalAccessException("索引错误!");
}
Node current = dummyHead.next;
for(int i=0;i<index;i++){
current = current.next;
}
return current == null?null:(T)current.ele;
}
//判断链表中是否含有指定元素
public boolean contains(T ele){
Node current = dummyHead.next;
while (current != null){
if(current.ele.equals(ele)){
return true;
}else {
current = current.next;
}
}
return false;
}
//更新节点
public void set(int index,T ele) throws IllegalAccessException{
if(index<0 || index>=size){
throw new IllegalAccessException("索引越界!");
}
Node current = dummyHead.next;
for(int i=0;i<index;i++){
current = current.next;
}
current.ele = ele;
}
//删除指定位置元素
public T remove(int index) throws IllegalAccessException{
if(index<0 || index>=size){
throw new IllegalAccessException("索引越界!");
}
Node prev = dummyHead;
for(int i=0;i<index;i++){
prev = prev.next;
}
Node delNode = prev.next;
prev.next = delNode.next;
delNode.next = null;
T ele = (T)delNode.ele;
size--;
return ele;
}
@Override
public String toString(){
StringBuffer sb = new StringBuffer();
Node current = dummyHead.next;
while (current!=null){
sb.append(current.ele+"--->");
current = current.next;
}
sb.append("NULL");
return sb.toString();
}
}
3. 链表实现栈
public class LinkedStack<T> implements Stack<T> {
private LinkedArray<T> data; //数据容器
private int size;
public LinkedStack(){
data = new LinkedArray<>();
size = 0;
}
@Override
public T pop() throws IllegalAccessException {
T ele = data.remove(0);
size--;
return ele;
}
@Override
public void push(T ele) throws IllegalAccessException {
data.addHead(ele);
size++;
}
@Override
public T peek() throws IllegalAccessException {
return data.getHead();
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return data.isEmpty();
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("栈顶");
sb.append("[");
sb.append(data.toString());
sb.append("]");
return sb.toString();
}
}
4.链表实现队列
public class LinkedQueue<T> implements Queue<T> {
private LinkedArray<T> data;
private int size;
public LinkedQueue(){
data = new LinkedArray<>();
size = 0;
}
@Override
public void enqueue(T ele) throws IllegalAccessException {
data.addTail(ele);
size++;
}
@Override
public T dequeue() throws IllegalAccessException {
T ele = data.remove(0);
size--;
return ele;
}
@Override
public T getFront() throws IllegalAccessException {
return data.getHead();
}
@Override
public boolean isEmpty() {
return data.isEmpty();
}
@Override
public int getSize() {
return size;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("对首");
sb.append("[");
sb.append(data.toString());
sb.append("]");
sb.append("队尾");
return sb.toString();
}
}
5.测试
public class Test {
public static void main(String[] args) throws IllegalAccessException {
Test test = new Test();
//test.linkedTest();
//test.stackTest();
test.queueTest();
}
public void linkedTest() throws IllegalAccessException {
LinkedArray<Integer> linked = new LinkedArray<>();
System.out.println(linked.isEmpty());//true
for(int i=0;i<100;i++){
if(i%10 == 0){
linked.addTail(i);
}
}
System.out.println(linked);//0--->10--->20--->30--->40--->50--->60--->70--->80--->90--->NULL
System.out.println(linked.isEmpty());//false
linked.remove(2);
System.out.println(linked);//0--->10--->30--->40--->50--->60--->70--->80--->90--->NULL
linked.set(4,12);
System.out.println(linked);//0--->10--->30--->40--->12--->60--->70--->80--->90--->NULL
linked.addHead(12);
System.out.println(linked);//12--->0--->10--->30--->40--->12--->60--->70--->80--->90--->NULL
linked.add(22,2);
System.out.println(linked);//12--->0--->22--->10--->30--->40--->12--->60--->70--->80--->90--->NULL
}
public void stackTest() throws IllegalAccessException {
LinkedStack<Integer> linkedStack = new LinkedStack<>();
System.out.println(linkedStack.isEmpty());//true
for(int i = 0;i<100;i++){
if(i%10 == 0){
linkedStack.push(i);
}
}//栈顶[90--->80--->70--->60--->50--->40--->30--->20--->10--->0--->NULL]
linkedStack.pop();//栈顶[80--->70--->60--->50--->40--->30--->20--->10--->0--->NULL]
System.out.println(linkedStack.peek());//80
System.out.println(linkedStack.getSize());//9
System.out.println(linkedStack);
}
public void queueTest() throws IllegalAccessException {
LinkedQueue<Integer> linkedQueue = new LinkedQueue<>();
System.out.println(linkedQueue.isEmpty());//true
for(int i = 0;i<100;i++){
if(i%10 == 0){
linkedQueue.enqueue(i);
}
}//对首[0--->10--->20--->30--->40--->50--->60--->70--->80--->90--->NULL]队尾
System.out.println(linkedQueue.dequeue());//0 对首[10--->20--->30--->40--->50--->60--->70--->80--->90--->NULL]队尾
System.out.println(linkedQueue.getFront());//10
System.out.println(linkedQueue.getSize());//9
System.out.println(linkedQueue);
}
}