代码实现
1.定义一个接口来提供一个链表应该具有的方法
(初始化、增、删、查、改、遍历、清空)
interface ILink
interface ILink {
/**
* 链表初始化操作
*/
void init();
/**
* 增加节点的操作
* @param data 插入的数据
*/
void add(Object data);
/**
* 删除首元结点
*/
void delete_head();
/**
* 删除指定索引节点
* @param index 要删除的节点索引
*/
void remove(int index);
/**
* 根据指定索引取得具体节点的内容
* @param index 索引值
* @return 返回节点数据
*/
Object get(int index);
/**
* 修改指定索引内容
* @param index 索引值
* @param data 修改后的数据
*/
void revise(int index, Object data);
/**
* 遍历链表
*/
void printLink();
/**
* 链表清空
*/
@SuppressWarnings("unused")//压制警告
void clear();
}
2.链表类,存有链表的结构和节点的结构,实现了接口
class Link implements ILink {
private Node head;//首元节点
private int count;//计数器
private Node last;//尾节点
//------------------------------------------
//封装一个内部类,方便访问彼此的私有属性
private class Node {
private Object data;//节点中存储的数据
private Node next;//下一个节点
private Node(Object data) {
this.data = data;
}
}
//-----------------------------------------
@Override
public void init() {
this.head = null;
this.count = 0;
}
@Override
public void add(Object data) {
Node newNode = new Node(data);//创建新节点
Node temp = this.last;//temp为尾节点
this.last = newNode;
if (this.head == null) {
this.head = newNode;
}else {
temp.next = newNode;
}
this.count++;
}
@Override
public void delete_head() {
System.out.println("删除首元结点:");
this.head = this.head.next;
this.count--;
if (count <= 0) {
throw new RuntimeException("链表为空!!");
}
}
@Override
public void remove(int index) {
if (isIndex(index)) {
//如果是尾节点
if (node(index) == this.last) {
node(index-1).next = null;
this.count--;
}
else {
node(index-1).next = node(index).next;
this.count--;
}
}
}
@Override
public Object get(int index) {
if (! isIndex(index)) {
return null;
}
System.out.println("查找索引:"+index);
System.out.print("找到了,data: ");
return node(index).data;
}
@Override
public void revise(int index, Object data) {
if (isIndex(index)) {
node(index).data = data;
}
System.out.print("修改索引"+index+"为"+data);
System.out.println(" 修改成功!");
}
public void printLink() {
Object[] data = this.toArray();
for (Object temp : data) {
System.out.print(temp+"--->");
}
System.out.println(" count: "+this.count);
}
@Override
public void clear() {
System.out.println("准备清空链表.....");
for (Node temp=this.head; temp!=null;) {
temp.data = null;
Node node = temp.next;
temp.next = null;
temp = node;
this.count--;
}
System.out.println("链表清空完毕!"+" count: "+count);
}
/**
* 把链表中节点的数据转到数组中存储
* @return 返回数组
*/
private Object[] toArray() {
Object[] result = new Object[this.count];
int i = 0;
for (Node temp=this.head; temp!=null; temp = temp.next) {
result[i++] = temp.data;
}
return result;
}
/**
* 判断指定索引是否合法
* @param index 索引值
* @return 合法返回true,非法返回false
*/
private boolean isIndex(int index) {
return index>=0 && index<this.count;
}
/**
* 取得节点
* 仅供本类方法使用
* @return 返回节点
*/
private Node node(int index) {
Node temp = this.head;
for (int i=0; i<index; i++) {
temp = temp.next;
}
return temp;
}
}
3.测试类
public class Test {
public static void main(String[] args) {
ILink link = new Link();
link.init();
link.add(0);
link.add(1);
link.add(2);
link.add(3);
link.add(4);
link.add(5);
link.add("end");
link.printLink();
link.remove(2);
link.printLink();
link.remove(5);
link.printLink();
System.out.println(link.get(3));
link.printLink();
link.revise(0,"hello");
link.printLink();
link.delete_head();
link.printLink();
link.clear();
}
}