/*
*特点:
*通过前一个元素的指针域可以顺序找到后面元素所在的位置
*因此所有操作全部是从第一个元素开始
*ps:头结点只表示整个链表的起始位置,而无任何内容
*
*链表的操作
*@isEmpty()-是否为空
*@isHead()-是否为头部
*@isTail()-是否为尾部
*@find(Object data)-查找元素的位置,没有就返回-1
*@add(Object data)-向链尾增加元素
*@insert(int index, Object data)-插入元素
*@replace(int index, Object data)-替换元素
*@delete()-删除链尾元素
*@deleteOf(int index)-删除指定元素
*@print()-打印整条链表
*@getHead()-得到链头
*@getTail()-得到链尾
*@getLength()-得到链长
*
*/
public class LinkList
{
private Node head = null;
private Node tail = null;
private int length = 0;
public LinkList(){}
public boolean isEmpty() {return 0 == length;}
public boolean isHead(Node e)
{
return null == e.getData() && head.getNext().equals(e.getNext());
}
public boolean isTail(Node e)
{
return e.equals(tail) && null == e.getNext();
}
public int find(Object data)
{
Node findE = head.getNext();
for(int i = 1; i <= length; i++)
{
if(data.equals(findE.getData()))
return i;
findE = findE.getNext();
}
return -1;
}
public void add(Object data)
{
Node e = new Node(data);
if(null == head)
{
head = new Node();
head.setNext(e);
}
else
tail.setNext(e);
tail = e;
length++;
}
public void insert(int index, Object data)
{
if(1 > index || length < index)
throw new ArrayIndexOutOfBoundsException("out of range");
Node insertE = new Node(data);
if(index == 1)
{
if(null == head)
{
head = new Node();
head.setNext(insertE);
tail = insertE;
}
else
{
insertE.setNext(head.getNext());
head.setNext(insertE);
}
}
else
{
Node e = head.getNext();
for(int i = 2; i < index; i++)
e = e.getNext();
insertE.setNext(e.getNext());
e.setNext(insertE);
}
length++;
}
public void replace(int index, Object data)
{
if(1 > index || index > length)
throw new ArrayIndexOutOfBoundsException("out of range");
Node replace = head.getNext();
for(int i = 2; i <= index; i++)
replace = replace.getNext();
replace.setData(data);
}
public void delete()
{
if(0 >= length)
throw new ArrayIndexOutOfBoundsException("the array is null");
Node deleteE = head.getNext();
for(int i = 2; i < length; i++)
deleteE = deleteE.getNext();
tail.delete();
tail = deleteE;
tail.setNext(null);
length--;
}
public void deleteOf(int index)
{
if(1 > index || length < index)
throw new ArrayIndexOutOfBoundsException("out of range");
Node e = head.getNext();
if(1 == index)
{
head.setNext(head.getNext().getNext());
e.delete();//删除元素
e = null;//删除元素
}
else
{
for(int i = 2; i < index; i++)
e = e.getNext();
Node deleteE = e.getNext();
e.setNext(e.getNext().getNext());
deleteE.delete();
deleteE = null;
}
length--;
}
public void print()
{
Node next = head.getNext();
while(null != next)
{
System.out.print(next.getData());
next = next.getNext();
}
System.out.println();
}
public Node getHead() {return head;}
public Node getTail() {return tail;}
public int getLength() {return length;}
}
class Node//节点类:包括自己的数据和下一个的指针
{
private Object data;
private Node next;//指针
public Node(Object data)
{
this.data = data;
next = null;
}
public Node(){}
public void setNext(Node next) {this.next = next;}
public Node getNext() {return next;}
public void setData(Object data) {this.data = data;}
public Object getData() {return data;}
public void delete()
{
data = null;
next = null;
}
}
class Test
{
public static void main(String[] args)
{
LinkList list = new LinkList();
/*
for(int i = 1; i <= 10; i++)
list.add(i);
list.deleteOf(5);
list.insert(8,11);
*/
list.add("s");
list.add("t");
list.add("u");
list.add("d");
list.add("y");
list.deleteOf(1);
list.insert(3, "u");
list.replace(2, "a");
System.out.println("find: " + list.find("u"));
Node next = list.getHead();
System.out.println(list.isHead(next));
list.print();
System.out.println("length: " + list.getLength());
}
}
单链表
最新推荐文章于 2023-05-06 22:43:40 发布