java数据接口之链表_Java数据结构--链表

public interface Predecessor {//定义接口 用于实现多态

public ListNode getNext();

public void setNext(ListNode next);

}

/**

* Created by root on 16-2-24.

*/

public class ListNode implements Predecessor{

private E item; //泛型元素

private ListNode next; //定义节点(指针)

public ListNode(E item) {

this.item = item; //初始化ListNode节点 具有一个item 和一个指向null的指针

next = null;

}

public ListNode(E item, ListNode next) {//重载的构造方法

this.item = item; //可以把在把前一个ListNode的指针指向新构造的节点

this.next = next;

}

public E getItem() {

return item; //获得节点的item字段

}

public void setItem(E item) {

this.item = item; //设置节点的item字段

}

public ListNode getNext() {

return next; //获得下一个节点

}

public void setNext(ListNode next) {

this.next = next; //设置下一个节点

}

}

/**

* Created by root on 16-2-25.

*/

public class LinkedList implements Predecessor {

private ListNode front;//头节点

public boolean isEmpty() {//判断链表是否为空

return front == null; //如果链表头节点的next指针指向null对象 返回true

}

public ListNode getNext() {

return front; //用于实现多态 LinkedList类型的链表也可以有getNext()方法 并且可以返回链表头指针

}

public void setNext(ListNode next){

front=next; //用于实现多态 LinkedList类型的链表也可以有setNext()方法 链表头指向输入的节点

}

public boolean contains(E target) {//判断链表是否包含某个item

for (ListNode node = front; node != null; node = node.getNext()) {//遍历链表用node!=null

if (node.getItem() == target) {

return true;

}

}

return false;

}

public LinkedList() { //构造方法 constructor 头指针指向空对象

front = null;

}

public int size() { //返回链表长度

int i = 0;

ListNode node = front; //把front指针 赋给node指针

while (node != null) {

i++;

node = node.getNext(); //指针在链表中移动

}

return i;

}

public String toString() { //实现打印链表

String result = "( ";

for (ListNode node = front; node != null; node = node.getNext()) {

result += node.getItem() + " ";

}

return result;

}

public E get(int index) { //获得链表索引对应的item

ListNode node = front;

for (int i = 0; i < index; i++) {

node = node.getNext();

}

return (E) node.getItem();

}

public void set(int index, E target) { //设置链表某一节点的item

ListNode node = front;

for (int i = 0; i < index; i++) {

node = node.getNext();

}

node.setItem(target);

}

public void add(E target) { //在尾部增加一个节点

Predecessor last = this; //实现多态 因为ListNode和LinkedList实现了同一个接口 所以可以这么做

while (last.getNext() != null) {//当last为 LinkedList类型时 返回front

last = last.getNext(); //这里不会报错 是因为ListNode和LinkedList实现了同一个接口

}

last.setNext(new ListNode(target)); //如果last是LinkedList类型setNext方法 会把front指针指向新的节点 而不会报错

}

public E remove(int index){

Predecessor pre=this; //同样利用了多态性

ListNode node =front; //两只算法 类似两个手指在链表上移动 一个在前一个在后

for(int i=0;i

pre=node;

node=node.getNext();

}

pre.setNext(node.getNext()); //把pre节点和 node节点的下一个节点相连 完成删除节点

return (E) node.getItem();

}

public boolean remove(E target){

Predecessor prev=this;

ListNode node=front;

while(node!=null){

if(node.getItem().equals(target)){

prev.setNext(node.getNext());

return true;

}

prev=node;

node=node.getNext();

}

return false;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值