双向链表

双向链表

双向链表的增、删、改、遍历思路

1.增加: 在双向链表的末尾增加;

只需找到最后一个结点temp;

temp.next = newNode;

newNode.pre = temp;

2.指定的位置插入

假设插入到index位置,

有两种情况:①当temp.next.no > index是则找到该位置,temp为该位置的上一个结点

② 遍历后到了链表尾则直接插入链表尾部

3.删除元素

4.修改元素

public class DoubleLinkList {
    public static void main(String[] args) {
        Node nodeA = new Node(1, "aaa", "AAA");
        Node nodeB = new Node(5, "bbb", "BBB");
        Node nodeC = new Node(8, "ccc", "CCC");
        Node nodeD = new Node(9, "ddd", "DDD");
        DoubleLink listArray = new DoubleLink();
        listArray.add(nodeA);
        listArray.add(nodeB);
        listArray.add(nodeC);
        listArray.insert(nodeD,10);
        listArray.getList();
       // listArray.update(nodeD);
//        listArray.delete(nodeC);
//        listArray.getList();
    }
}
class DoubleLink {
    private Node head = new Node(0,"","");
    public Node getHead() {
        return head;
    }

    // 遍历双向链表
    public void getList() {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        Node temp = head;
        while (temp.next != null) {
            System.out.println(temp.next);
            temp =temp.next;
        }
    }

    // 双向链表中添加元素
    public void add(Node node) {
        Node temp = head;

        while (temp.next != null) {
            temp = temp.next;
        }
        temp.next = node; // 在尾部插入要增加的结点
        node.pre = temp;  // 让新增的结点的pre指向前一个结点
    }

    // 修改双向链表的元素
    public void update(Node node) {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        Node temp = head.next;
        while (temp.no != node.no) {
            if (temp == null) {
                System.out.println("未找到该元素");
              return;
            }
            temp =temp.next;
        }
        temp.name = node.name;
        temp.bName = node.bName;
    }

    // 删除双向链表的元素
    public void delete(Node node) {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        Node temp = head.next;
        while (temp.no != node.no) {
            if (temp == null) {
                System.out.println("未找到该结点");
                return;
            }
            temp = temp.next;
        }
        temp.pre.next = temp.next; // 要删除结点的上一个结点next指向要删除节点的下一个结点

        // 判断删除的结点是不是最后一个,如果最后一个则不执行
        if (temp.next != null) {
            temp.next.pre = temp.pre;  //让当前元素的下一个结点的pre指向当前元素的像一个结点的pre
        }
    }

    // 指定位置插入元素
    public void insert(Node node,int index) {
      Node temp = head;
      boolean flag = false;
      while (true) {
          if (temp.next == null) {
              System.out.println("到尾了,直接插入");
              break;
          } else if (temp.next.no > index) {
              System.out.println("找到了位置");
              break;
          } else if (temp.next.no == index) {
             flag = true;
              break;
          }
          temp = temp.next;
      }
      if (flag) {
          System.out.println("位置已经存在");
      } else {
          /**
           * 先连接后面的
           */
          if (temp.next != null) {
              temp.next.pre = node; // 将后一个元素的pre于当前节点的pre相连
              node.next = temp.next;
          }
          /**
           *  在连接前面的
           */
          temp.next = node;
          node.pre = temp;
      }

    }
}
class Node {
    public int no;
    public String name;
    public String bName;
    public Node pre;  // 指向上一个结点
    public Node next; // 指向下一个结点

    public Node(int no, String name, String bName) {
        this.no = no;
        this.name = name;
        this.bName = bName;
    }

    @Override
    public String toString() {
        return "Node{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", bName='" + bName + '\'' +
                '}';
    }
}

posted @ 2021-04-10 09:29  撑起一片阳光  阅读(88)  评论(0编辑  收藏  举报