Node结点的创建
private class Node {// 结点
/*
* 1.数据域 2.指针域
*/
E data;
Node next;
public Node() {
this(null, null);
}
public Node(E data) {
this(data, null);
}
public Node(E data, Node next) {
this.data=data;
this.next=next;
}
}
单链表实现list接口
package p02.动态链表;
import 顺序表.List;
public class SingleLinkList<E> implements List<E> {
private Node head;
private Node rear;
private int size;
public SingleLinkList() {
head = new Node();
rear = head;
size = 0;
}
private class Node {// 结点
/*
* 1.数据域 2.指针域
*/
E data;
Node next;
public Node() {
this(null, null);
}
public Node(E data) {
this(data, null);
}
public Node(E data, Node next) {
this.data=data;
this.next=next;
}
}
@Override
public int getSize() {
// TODO Auto-generated method stub
return size;
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return size == 0;
}
@Override
public void add(int index, E e) {
// TODO Auto-generated method stub
/*
* 头插 尾插 中间插
*/
// 头插
if(index<0||index>size) {
throw new IllegalArgumentException("下标有误!");
}
Node p = new Node(e);
if (index == 0) {// 头
p.next = head.next;
head.next = p;
if (size == 0) {
rear =p;
}
} else if (index == size) {// 尾
p.next = rear.next;
rear.next = p;
rear = p;
} else {// 中间
Node flag = head;// 游标,为了找到要插入的元素的前一个位置
int j = 0;
while (j < index) {
flag = flag.next;
j++;
}
p.next = flag.next;
flag.next = p;
flag = null;// 释放这个游标,类似与C中的free函数
}
size++;
}
@Override
public void addFirst(E e) {
// TODO Auto-generated method stub
add(0, e);
}
@Override
public void addLast(E e) {
// TODO Auto-generated method stub
add(size, e);
}
@Override
public E get(int index) {
/*
* 1.查表头 2.查表中间 3.查表尾
*/
// TODO Auto-generated method stub
if (index < 0 || index > size - 1 || size == 0) {
throw new IllegalArgumentException("下标越界或者为空链表");
}
if (index == 0) {// 头查
return head.next.data;
} else if (index == size - 1) {// 尾查
return rear.data;
} else {// 中查
int j = 0;
Node p = head;
while (j <= index) {
p = p.next;
++j;
}
return p.data;
}
}
@Override
public E getFirst() {
// TODO Auto-generated method stub
return get(0);
}
@Override
public E getLast() {
// TODO Auto-generated method stub
return get(size - 1);
}
@Override
public void set(int index, E e) {
// TODO Auto-generated method stub
if (index < 0 || index > size - 1) {
throw new IllegalArgumentException("下表越界");
}
Node p = head;
for (int i = 0; i < index; i++) {
p = p.next;
}
p.data = e;
}
@Override
public boolean contains(E e) {
// TODO Auto-generated method stub
return find(e) != -1;
}
@Override
public int find(E e) {
// TODO Auto-generated method stub
if(isEmpty()) {
return -1;
}
Node p = head;
int index = -1;
while (p.next != null) {
index++;
p = p.next;
if (p.data.equals(e)) {
return index;
}
}
return -1;
}
@Override
public E remove(int index) {
// TODO Auto-generated method stub
/*
* 头删 尾删 中间任意删
*/
// 头删
E data = null;
if (index == 0) {
Node p = head.next;
data=p.data;
head.next=p.next;
p=null;
if(size==1) {//删最后一个元素,要重置尾指针
rear=head;
}
}else if(index==size-1) {//尾删
Node p=head;
for(int i=0;i<index;i++) {
p=p.next;
}
data=p.next.data;
p.next=rear.next;
rear=p;
}else {
Node p=head;
for(int i=0;i<index;i++) {
p=p.next;
}
data=p.next.data;
Node flag=p.next;
p.next=flag.next;
flag=null;
}
size--;
return data;
}
@Override
public E removeFirst() {
// TODO Auto-generated method stub
return remove(0);
}
@Override
public E removeLast() {
// TODO Auto-generated method stub
return remove(size-1);
}
@Override
public void removeElement(E e) {
// TODO Auto-generated method stub
int index=find(e);
if(index!=-1) {
remove(index);
}
}
@Override
public void clear() {
// TODO Auto-generated method stub
head=null;
rear=head;
size=0;
}
@Override
public String toString() {
if(isEmpty()) {
return "[]";
}
StringBuilder str=new StringBuilder("[");
Node p=head;
while(true) {
p=p.next;
if(p==rear) {
str.append(p.data+"]");
break;
}else {
str.append(p.data+",");
}
}
return str.toString();
}
}
测试单链表
package p02.动态链表;
public class TestSgLL {
public static void main(String[] args) {
// TODO Auto-generated method stub
SingleLinkList<Integer> s=new SingleLinkList<Integer>();
System.out.println(s);
s.addFirst(100);
s.addFirst(200);
s.addFirst(300);
s.addLast(26545);
s.add(1, 1100);
System.out.println(s.find(26545));
System.out.println(s.find(456465465));
System.out.println(s);
System.out.println(s.getSize());
System.out.println(s.isEmpty());
System.out.println(s.get(2));
System.out.println(s.getLast());
System.out.println(s.getFirst());
System.out.println(s.removeFirst());
System.out.println(s);
System.out.println(s.removeLast());
System.out.println(s);
System.out.println(s.getSize());
s.add(3, 66);
System.out.println(s);
System.out.println(s.remove(1));
System.out.println(s);
//System.out.println(s.remove(index));
}
}
测试结果
[]
4
-1
[300,1100,200,100,26545]
5
false
200
26545
300
300
[1100,200,100,26545]
26545
[1100,200,100]
3
[1100,200,100,66]
200
[1100,100,66]