package p02.动态链表;
//这里实现的接口List已在ArrayList中体现,就不多赘述
import p01.动态数组.List;
//单链表
public class LinkedList<E> implements List<E>{
private Node head; //头指针
private Node rear; //尾指针
private int size; //元素个数
public LinkedList(){
head=new Node(); //创建虚拟头节点
rear=head;
size=0;
}
private class Node{
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() {
return size;
}
@Override
public boolean isEmpty() {
return size==0;
}
@Override
public void add(int index, E e) {
if(index<0||index>size){
throw new IllegalArgumentException("角标非法");
}
Node n=new Node(e);
/*Node n=new Node();
n.data=e;
n.next=null;*/
if(index==0){//头插法
n.next=head.next;
head.next=n;
if(isEmpty()){
rear=n;
}
}else if(index==size){//尾插法
n.next=rear.next;
rear.next=n;
rear=n;
}else{//中间插
Node p=head;
for(int i=0;i<index;i++){
p=p.next;
}
n.next=p.next;
p.next=n;
}
size++;
}
@Override
public void addFrist(E e) {
add(0, e);
}
@Override
public void addLast(E e) {
add(size, e);
}
@Override
public E get(int index) {
if(index<0||index>=size){
throw new IllegalArgumentException("角标非法");
}
if(index==0){//表头
return head.next.data;
}else if(index==size-1){//表尾
return rear.data;
}else{//中间
Node p=head;
for(int i=0;i<=index;i++){
p=p.next;
}
return p.data;
}
}
@Override
public E getFrist() {
return get(0);
}
@Override
public E getLast() {
return get(size-1);
}
@Override
public E remove(int index) {
if(index<0||index>=size){
throw new IllegalArgumentException("角标非法");
}
E res=null;
if(index==0){//删头
Node n=head.next;
res=n.data;
head.next=n.next;
n=null;
if(size==1){
rear=head;
}
}else if(index==size-1){//删尾
res=rear.data;
Node p=head;
while(p.next!=rear){
p=p.next;
}
p.next=rear.next;
rear=p;
}else{//删中间
Node p=head;
for(int i=0;i<index;i++){
p=p.next;
}
Node n=p.next;
res=n.data;
p.next=n.next;
n=null;
}
size--;
return res;
}
@Override
public E removeFrist() {
return remove(0);
}
@Override
public E removeLast() {
return remove(size-1);
}
@Override
public void set(int index, E e) {
if(index<0||index>=size){
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) {
return find(e)!=-1;
}
@Override
public int find(E e) {
if(isEmpty()){
return -1;
}
int index=-1;
Node p=head;
while(p.next!=null){
index++;
p=p.next;
if(p.data.equals(e)){
return index;
}
}
return -1;
}
@Override
public void removeElement(E e) {
int index=find(e);
if(index!=-1){
remove(index);
}
}
@Override
public void clear() {
head.next=null;
rear=head;
size=0;
}
public String toString(){
StringBuilder sb=new StringBuilder();
if(isEmpty()){
return "[]";
}else{
sb.append("[");
Node p=head;
while(true){
p=p.next;
if(p==rear){
sb.append(p.data+"]");
break;
}else{
sb.append(p.data+",");
}
}
}
return sb.toString();
}
}
JAVA数据结构LinkedList(单链表)
最新推荐文章于 2022-11-18 19:17:32 发布