双向链表

简介: 双向链表

1.png

双向链表思路分析



package DataStructures;


代码实现



/*
• 双向链表
*/
public class DoubleLinkedListDemo {
public static void main(String[] args) {
HeroNode2 hero1 = new HeroNode2(1, "宋江", "及时雨");
HeroNode2 hero2 = new HeroNode2(2, "卢俊义", "玉麒麟");
HeroNode2 hero3 = new HeroNode2(3, "吴用", "智多星");
DoubleLinkedList doublelist = new DoubleLinkedList();
doublelist.addNode(hero1);
doublelist.addNode(hero2);
doublelist.addNode(hero3);
//doublelist.findNode(1);
doublelist.listNode();
}
}
class DoubleLinkedList {
private HeroNode2 head = new HeroNode2(0,"","");// 头结点
public HeroNode2 getHead() {
    return head;
}
// 添加节点
public void addNode(HeroNode2 hero) {
    HeroNode2 temp = head;
    while (true) {
        if (temp.next == null) {
            break;
        }
        temp = temp.next;
    }
    // 形成关联
    temp.next = hero;
    hero.pre = temp;
}
// 删除结点
public void deleteNode(int no) {
    HeroNode2 temp = head;
    boolean flag = false;
    while (true) {
        if (temp == null) {
            break;
        }
        if (temp.no == no) {
            flag = true;
            break;
        }
        temp = temp.next;// 后移
    }
    if (flag) {
        temp.next = temp.next.next;
        temp.pre.pre = temp;
    } else {
        System.out.printf("您所要删除%d的结点不存在\n", no);
    }
}
// 更新結點
public void updateNode(HeroNode2 hero) {
    HeroNode2 temp = head;
    boolean flag = false;
    while (true) {
        if (temp == null) {
            break;
        }
        if (temp.no == hero.no) {
            flag = true;
            break;
        }
        temp = temp.next;
    }
    if (flag) {
        temp.name = hero.name;
        temp.nickname = hero.nickname;
    } else {
        System.out.printf("您所要修该%d的结点不存在\n", hero.no);
    }
}
// 查找結點
public void findNode(int no) {
    HeroNode2 temp = head;
    boolean flag = false;
    while (true) {
        if (temp == null) {
            break;
        }
        if (temp.no == no) {
            flag = true;
            break;
        }
        temp = temp.next;
    }
    if (flag) {
        System.out.println(temp);
    } else {
        System.out.println("您所查找的结点不存在"); 
    }
}
// 遍历结点
public void listNode() {
    if (head.next == null) {
        System.out.println("链表为空");
        return;
    }
    HeroNode2 temp = head.next;
    while (true) {
        if (temp == null) {
            break;
        } else {
            System.out.println(temp);
        }
        temp=temp.next;
    }
}
}



class HeroNode2 {
public int no;
public String name;
public String nickname;
public HeroNode2 pre;// 指向前一个结点
public HeroNode2 next;// 指向后一个结点
public HeroNode2(int no, String name, String nickname) {
    this.no=no;
    this.name=name;
    this.nickname=nickname;
}
@Override
public String toString() {
    return "HeroNode2 [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
}


相关文章
|
1天前
|
存储
双向链表
单链表每个结点有一个指针域和一个数据域,要访问任何结点都需知道头结点,不能逆着进行。双向链表则添加了一个指针域,通过两个指针域分别指向结点的前一个结点和后一个结点。这样的话,可以通过双链表的任何结点访问到它的前一个结点和后一个结点。 两个指针域一个存储直接后继结点的地址,一般称为右链域,另一个存储直接前驱结点,一般称为左链域。
|
1月前
|
存储
双向链表(详解)
双向链表(详解)
24 1
|
5月前
|
存储
双向链表专题
双向链表专题
41 6
|
5月前
双向链表的实现
双向链表的实现
21 0
|
6月前
秒懂双向链表
秒懂双向链表
27 0
|
6月前
|
存储
双向链表介绍
带头链表⾥的头节点,实际为“哨兵位”,哨兵位节点不存储任何有效元素,只是站在这⾥“放哨的”。哨兵位存在的意义:避免链表出现死循环。
37 0
|
6月前
|
Java
7.双向链表最佳实现
7.双向链表最佳实现
57 1
|
6月前
|
存储
【双向链表】数据结构双向链表的实现
【双向链表】数据结构双向链表的实现
|
存储 算法 搜索推荐
双向链表
双向链表是一种链式存储结构,每个节点包含两个指针,分别指向其前驱和后继。相比于单向链表,双向链表可以在常数时间内向前或向后遍历整个链表。因此,双向链表在需要频繁遍历链表的场景中具有优势。
56 7
|
6月前
|
存储
双向链表的操作
双向链表的操作