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用了比较策略(设计模式之策略模式),相当于两个节点的数据值比较
如有错误或者改进意见欢迎提出~~