双链表中每一个节点有两个指针域,一个指向前驱结点,一个指向后续节点。因此可以通过访问前置节点,更加的方便。
c/c++实现
照例建立一个结构体,但是拥有两个指针域
struct Node
{
Node *head; //指向前置节点
int data;
Node *next;//指向后置节点
};
照例添加5个数字
void getDoubleNodeHead() //双链表头插法
{
Node *node=(Node*)malloc(sizeof(Node));
Node *s;
node->next=NULL; //头结点和尾节点都是空值
node->head=NULL;
for (int i=0;i<5;i++)
{
s=(Node*)malloc(sizeof(Node));
s->data=i;
s->next=node->next; //s->next指向node的后置节点
if(node->next!=NULL)
{
node->next->head=s; //如果node->next 不为空,将他的头指向s
}
s->head=node; //将s头指向node
node->next=s; //将node尾指向s,完成链表创建
}
}
void getDoubleNodeTail() //双链表尾插法
{
Node *node=(Node*)malloc(sizeof(Node));
Node *s,*r;
r=node; //指向头结点
for(int i=0;i<5;i++)
{
s=(Node*)malloc(sizeof(Node));
s->data=i;
r->next=s; //将r的后置节点置为s
s->head=r; //s的头结点置为r
r=s; //将r置为尾节点
}
r->next=NULL;
}
java代码实现
public class Link{
int data;
Link head;
Link next;
public Link(int i){
this.data=i;
}
public void setHead(Link head) {
this.head = head;
}
public void setNext(Link next) {
this.next = next;
}
public int getData() {
return data;
}
}
public class DoubleNode{
private Link link; //头结点
public DoubleNode(){
link=new Link(0);
link.head=null;
}
void addDoubleNodeHead(){
link.next=null;
for (int i=1;i<=5;i++){
Link two=new Link(i);
two.next=link.next;
if(link.next!=null) {
link.next.head = two;
}
two.head=link;
link.next=two;
}
}
void addDoubleNodeTail(){
Link twoFlag=link;
for (int i=1;i<=5;i++){
Link two=new Link(i);
twoFlag.next=two;
two.head=twoFlag;
twoFlag=two;
}
twoFlag.next=null;
}
}
如果有错误欢迎指正