java操作链表_链表的各种操作(Java实现)

1、删除结点

public boolean remove(Object e) {

SLNode p = getPreNode(e);

if(p!=null){

p.setNext(p.getNext().getNext());

size--;

return true;

}

return false;

}

2、插入结点

插入结点分为3种:

(1)、插入到第 i 的位置

public void insert(int i, Object e) throws OutOfBoundaryException {

if(i<0||i>size)

throw new OutOfBoundaryException("错误,指定的插入序号越界。");

SLNode p = getPreNode(i);

SLNode q = new SLNode(e,p.getNext());

p.setNext(q);

size ++ ;

return;

}

(2)、插入到指定元素之前

//将元素e插入到obj之前

public boolean insertBefore(Object obj, Object e) {

SLNode p = getPreNode(obj);

if(p!=null){

SLNode q = new SLNode(e,p.getNext());

p.setNext(q);

size ++;

return true;

}

return false;

}

(3)、插入到指定元素之后

//将元素e插入到obj之后

public boolean insertAfter(Object obj, Object e) {

SLNode p = head.getNext();

while(p!=null){

if(strategy.equal(p.getData(),obj)){

SLNode q = new SLNode(e,p.getNext());

p.setNext(q);

size ++;

return true;

}

else p = p.getNext();

}

return false;

}

3、链表反转

(1)、遍历反转

public SLNode Reverve(){

if(size<0){

throw new OutOfBoundaryException("错误,链表为空~");

}

SLNode pre = head.getNext();

SLNode cur = head.getNext().getNext();

head.getNext().setNext(null);//将第一个不是跟结点的结点的指向设成空(因为这个链表根节点没有数据

SLNode next;

while (null != cur) {

next = cur.getNext();

cur.setNext(pre);   //最主要的一步

pre = cur;

cur = next;

}

head.setNext(pre);//让pre连到head上

return head;

}

(2)、递归反转

private SLNode reverse(SLNode head)

{

if (null == head || null == head.getNext())

{

return head;

}

SLNode reversedHead = reverse(head.getNext());

head.getNext().setNext(head);

head.setNext(null);

return reversedHead;

}

public SLNode revers(){

SLNode p = head.getNext();

head.setNext(this.reverse(p));

return head;

}

最后辅助方法:

//辅助方法:获取数据元素e所在结点的前驱结点

private  SLNode getPreNode(Object e){

SLNode p = head;

while(p.getNext()!=null)

if(strategy.equal(p.getNext().getData(),e))return p;

else p = p.getNext();

return null;

}

说明:

strategy用了比较策略(设计模式之策略模式),相当于两个节点的数据值比较

如有错误或者改进意见欢迎提出~~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值