package
com.datastructure.singlylinklist;
/**
* 实现一个单链表
* 实现功能:
* 增加一个节点(头插法,尾插法)
* 删除一个节点(删除第一个节点,删除最后一个节点,删除任何一个节点)
* 查找(查找到一个list中的某个元素)
* @author Xinyuyu
*
*/
public
class SinglyLinkList <T> {
/*
* 实现一个节点的数据结构
* 数据域
* 指针域
*/
// header指向list的头
// tail指向list的尾
private
IntSLLNode header;
private
IntSLLNode tail;
class
IntSLLNode{
public
Object data;
public
IntSLLNode next;
//
public
IntSLLNode(Object data){
this (data, null );
}
public
IntSLLNode(Object data, IntSLLNode next){
this .data = data;
this .next = next;
}
}
public
SinglyLinkList(){
header = tail = null ;
}
// 头插法增加一个节点
public
void addToHeader(Object o){
// 链表不为空的情况
// 链表为空的情况
header = new
IntSLLNode(o, header);
if (tail == null )
tail = header;
}
// 尾插法增加一个节点
public
void addToTail(Object o){
// 链表不为空的情况
// 链表为空的情况
IntSLLNode newNode = new
IntSLLNode(o);
if (!isEmpty()){
tail.next = newNode;
tail = newNode;
} else
tail = header = newNode;
}
// 删除第一个节点
public
Object deleteFromHeader() throws
Exception{
// 链表不为空切大于一个节点
// 链表仅有一个节点
// 链表为空
IntSLLNode node = header;
if (!isEmpty()){
header = header.next;
} else
if (!isEmpty() && header == tail){
tail = header = null ;
} else {
// 链表为空抛出异常
throw
new Exception( "SSL is empty" );
}
return
node.data;
}
// 删除最后一个节点
public
Object delteFromTail() throws
Exception{
// 链表不是空且大于一个节点的时候
// 链表仅有一个节点的时候
// 链表是空的情况
IntSLLNode node = tail;
if (!isEmpty() && header != tail){
// 一个临时指针,指向头节点,遍历到倒数第二个节点出,将尾指针指向倒数第二个节点
IntSLLNode temp = header;
for (; temp.next != tail;){
temp = temp.next;
}
tail = temp;
temp.next = null ;
} else
if (!isEmpty() && header == tail){
tail = header = null ;
} else {
// 当列表为空的时候抛出异常
throw
new Exception( "SSL is empty" );
}
return
node.data;
}
// 删除链表中的某个节点
public
Object delete(Object o) throws
Exception{
// 链表不为空且包含大于一个节点
// 链表仅包含一个节点
// 链表为空的情况
// 删除的为第一个节点
if (o.equals(header.data)){
return
deleteFromHeader();
// 删除的为最后一个节点
} else
if (o.equals(tail.data)){
return
delteFromTail();
} else {
IntSLLNode temp = header;
if (!isEmpty() && header != tail){
for (; !temp.next.data.equals(o);){
temp = temp.next;
}
if (temp != null ){
temp.next = temp.next.next;
temp = temp.next;
}
} else
if (!isEmpty() && header == tail){
if (header.equals(o)){
temp = header;
header = tail = null ;
}
} else {
throw
new Exception( "SSL is empty" );
}
return
temp.data;
}
// 如果查找到就返回一个节点信息
// 查找不到
}
// 删除节点的另外一个写法(需要两个指针)
public
Object deletePro(Object o) throws
Exception{
// 链表不为空且大于一个节点
// 链表仅包含一个节点
// 链表为空
IntSLLNode node = null ;
if (header.data.equals(o)){
return
deleteFromHeader();
}
if (!isEmpty() && header != tail){
IntSLLNode pre = header, las = header.next;
for (; las != null
&& !las.data.equals(o); ){
pre = pre.next;
las = las.next;
}
if (las != null )
pre.next = las.next;
else
return
delteFromTail();
node = las;
} else
if (!isEmpty() && header == tail){
if (header.equals(o));
tail = header = null ;
} else {
throw
new Exception( "SSL is empty" );
}
return
node.data;
}
// 查找链表中的某个节点
public
Object find(Object o) throws
Exception{
// 链表为空
// 链表不为空
IntSLLNode temp = null ;
if (!isEmpty()){
temp = header;
for (; temp != null
&& !temp.data.equals(o); ){
temp = temp.next;
}
if (temp == null )
return
null ;
else
return
temp.data;
} else {
// 当链表为空的时候也就是不会查找到需要的节点
throw
new Exception( "The object is not exist in the SLL" );
}
}
// 判断链表是否为空
public
boolean isEmpty(){
return
header == null ;
}
// 打印出链表
public
void printSinglyLinkList(String name){
System.out.print(name + " : " );
for (IntSLLNode tempNode = header; tempNode != null ; tempNode = tempNode.next){
System.out.print(tempNode.data.toString() + "->" );
}
}
// 清空列表
public
void emptySLL(){
header = tail = null ;
}
}
|