Java数据结构之线性结构-线性表-双向链式存储(双向链表)
程序员文章站
2022-03-12 23:31:46
...
- 双向链表结构
- 添加节点
- 删除节点
删除节点要注意判断待删除节点的下一个节点是否为空,因为他最终要指向待删除节点的前一个结点。尤其要注意数组空指针异常。
- 源代码
package linearSturcture;
/**
* 线性结构-线性表-双向链式存储(双向链表)
* @author cx998
*
*/
public class BidirectionalLinkedStorage {
private BidirectionalNode root;//根节点
private int size=0;//当前链表大小
/**
* 添加节点
* @param value
*/
public void add(Object value)
{
BidirectionalNode node=new BidirectionalNode(value);
if(root==null)
{
root=node;
size++;
}
else
{
BidirectionalNode n=root;
while(n.getNext()!=null)
n=n.getNext();
n.setNext(node);
node.setPre(n);
size++;
}
}
/**
* 删除节点
* @param index
*/
public void delete(int index)
{
if(index>=size||index<0)
throw new RuntimeException("删除位置不正确,非法访问!");
else if(index==0)
{
root=root.getNext();
root.setPre(null);
size--;
}
else
{
int flag=0;//标志位
BidirectionalNode n=root;
while(n.getNext()!=null)
{
flag++;
if(flag==index)
{
if(n.getNext().getNext()!=null)
n.getNext().getNext().setPre(n);
n.setNext(n.getNext().getNext());
break;
}
n=n.getNext();
}
size--;
}
}
/**
* 打印当前双向链表
*/
public void display()
{
System.out.println("当前双向链表大小为:"+size);
for(BidirectionalNode i=root;i!=null;i=i.getNext())
{
if(i.getNext()!=null)
System.out.print(i.getValue()+"->");
else
System.out.print(i.getValue());
}
}
}
/**
* 双向链表节点
* @author cx998
*
*/
class BidirectionalNode{
private Object value;//节点数据
private BidirectionalNode pre;//前节点指针
private BidirectionalNode next;//后节点指针
public BidirectionalNode(Object value)
{
this.value=value;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public BidirectionalNode getPre() {
return pre;
}
public void setPre(BidirectionalNode pre) {
this.pre = pre;
}
public BidirectionalNode getNext() {
return next;
}
public void setNext(BidirectionalNode next) {
this.next = next;
}
}