ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

双向链表

2021-04-10 10:05:40  阅读:117  来源: 互联网

标签:Node node temp next 链表 双向 public


双向链表

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

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 + '\'' +
                '}';
    }
}

标签:Node,node,temp,next,链表,双向,public
来源: https://www.cnblogs.com/cqyp/p/14639592.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有