链表的尾插法
头插法:将新节点永远插在头结点的后方,虽然简便,但在遍历时会时顺序颠倒,尾插法很好的解决了这个问题。
在使用尾插法时,需要定义插入结点的前结点,或者将其定义为尾巴结点,
使用方法先时先判断,如果链表为空,即根节点的后继结点为空时,直接插入即可,与头插法相同,而当不为空时,说明有后继结点,此时需遍历找到尾巴结点,当pnode的next==null时,说明为最后一个结点,将想插入的结点插入即可。
代码如下:
public void insertForTail(Object data){
//node为插入结点
//pnode为其前驱结点
Node node =new Node(data);
Node pnode=new Node();
if(this.root.next==null)
{
node.next=root.next;
root.next=node;
System.out.println("根节点为空");
}else{
pnode=this.root.next;
while(pnode.next!=null){
pnode=pnode.next;
}
node.next=pnode.next;
pnode.next=node;
System.out.println("根节点不为空,插入成功");
}
}
也可在想要插入的位置插入:原理同上,但要注意,如果要插入第一个位置,无论是否链表为空,都直接在根节点后方插入
public void insertForTail(int n,Object data){
//node为插入结点
//pnode为其前驱结点
Node node =new Node(data);
Node pnode=new Node();
if(this.root.next==null||n==1)
{
node.next=root.next;
root.next=node;
}
else{
pnode=this.root;
int j=1;
while(pnode.next!=null&&j<n){
pnode=pnode.next;
j++;
}
node.next=pnode.next;
pnode.next=node;
}
}
整表删除
创建两个结点用来标记删除结点及后继结点,
public void link_alldelete(Linkedlist linkedlist){
Node node=new Node();
Node pnode=new Node();
pnode=linkedlist.root.next;
while (pnode!=null){
node=pnode.next;
pnode.free();
pnode=node;
}
linkedlist.root.next=null;
System.out.println("删除完成");
}