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;
}
}
package SinglyLinkList;
public class Persion {
private String name;
private int age;
public Persion(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString(){
return "[" + this.name + " age is " + this.age + "]";
}
// 需要重写equal方法来完成删除和查找
@Override
public boolean equals(Object o) {
if(this.name.equals(((Persion) o).getName()) && this.age == ((Persion) o).getAge())
return true;
else
return false;
}
}
package SinglyLinkList;
import com.datastructure.singlylinklist.SinglyLinkList;
public class TestOfSinglyList {
public static void main(String[] args) {
SinglyLinkList<Persion> singlyLinkList = new SinglyLinkList<Persion>();
Persion p1 = new Persion("张三", 34);
Persion p2 = new Persion("李四", 24);
Persion p3 = new Persion("王五", 44);
Persion p4 = new Persion("李以", 44);
Persion p5 = new Persion("王七", 44);
// 完成头插法
singlyLinkList.addToHeader(p1);
singlyLinkList.addToHeader(p2);
singlyLinkList.addToHeader(p3);
singlyLinkList.addToHeader(p4);
singlyLinkList.addToHeader(p5);
singlyLinkList.printSinglyLinkList("完成头插法");
System.out.println();
// System.out.println();
// // 清空链表
// singlyLinkList.emptySLL();
// // 完成尾插法
// singlyLinkList.addToTail(p1);
// singlyLinkList.addToTail(p2);
// singlyLinkList.addToTail(p3);
// singlyLinkList.printSinglyLinkList("完成头插法");
// System.out.println();
// // 完成删除尾节点
// try {
// Persion p = (Persion)singlyLinkList.delteFromTail();
// singlyLinkList.printSinglyLinkList("删除了最后一个节点");
// System.out.println();
// System.out.println("被删除的尾节点是 :" + p.getName() + " age is " + p.getAge());
// } catch (Exception e) {
// e.printStackTrace();
// }
// // 完成删除头节点
// try {
// Persion p = (Persion)singlyLinkList.deleteFromHeader();
// singlyLinkList.printSinglyLinkList("删除了第一个节点");
// System.out.println();
// System.out.println("被删除的头节点是 :" + p.getName() + " age is " + p.getAge());
// } catch (Exception e) {
// e.printStackTrace();
// }
// 删除任意一个节点
//Persion p = new Persion("张三", 34);
try {
singlyLinkList.deletePro(p5);
singlyLinkList.deletePro(p4);
singlyLinkList.deletePro(p3);
singlyLinkList.deletePro(p2);
singlyLinkList.deletePro(p1);
} catch (Exception e) {
e.printStackTrace();
}
singlyLinkList.printSinglyLinkList("任意删除一个节点");
System.out.println();
try {
System.out.println(singlyLinkList.find(p1));
} catch (Exception e) {
e.printStackTrace();
}
}
}