资深咸鱼
本帖最后由 悠-零封 于 2020-4-9 10:51 编辑
  1. import java.util.Scanner;

  2. public interface Shop<T> {
  3.     public void add(T data, boolean pan);//增加
  4.     public Object[] buySome();//返回具体内容
  5.     public void revise();//修改
  6.     public void empty();//清空
  7.     public void size();//计算物品数量
  8. }
  9. class NodeList<T> implements Shop<T> { //操作实现类
  10.     private Node<T> root;//根节点
  11.     private T data;//数据存储
  12.     private int foot;//物品next计数
  13.     private int size;//记总物品件数
  14.     private Object [] node;
  15.     private int x = 0;
  16.     public NodeList() {}

  17.     private class Node<T> {//设置泛型避免错误
  18.         private T data;//存储数据
  19.         private Node<T> next;
  20.         private int foot;//物品next计数
  21.         private Node<T> root;//根节点
  22.         private Node<T> service;//保存上一个节点的内容
  23.         public Node(T data) {//存储数据
  24.             this.data = data;
  25.         }
  26.         public void addNode(Node<T> newPer) {//内部类处理不需要被外部调用的东西
  27.             if (this.root == null) {
  28.                 this.root = newPer;
  29.             } else
  30.             if (this.next == null) {//判断next属性是否为空
  31.                 this.next = newPer;
  32.             } else {
  33.                 this.next.addNode(newPer);//如果不是,则再测下一个next的值的值是否为空
  34.             }
  35.         }
  36.         public void removeNode(int foots, Node newPer) {
  37.             if (foots == 0) {
  38.                 this.next = this.next.next;
  39.             }
  40.             if (foots == x - 2) {//保存对象内容
  41.                 newPer.service = newPer.next.next;
  42.                 newPer.next = newPer.service;
  43.                 newPer.service = null;
  44.                 return;
  45.             } else {
  46.                 x++;
  47.                 newPer.next.removeNode(foots, newPer);
  48.             }
  49.         }
  50.         public void sum() {
  51.             NodeList.this.node[this.foot++] = this.data;
  52.             if (this.next != null) {
  53.                 this.next.sum();
  54.             }
  55.         }
  56.     }
  57.     private Node<T> getRoot() {
  58.         return this.root;
  59.     }

  60.     public NodeList(T data) {
  61.         this.data = data;
  62.     }

  63.     @Override
  64.     public void add(T data, boolean pan) {//确认删出或者增加
  65.         //外部方法确定根节点是否为空
  66.         if (data == null) {//如果data的值为空,直接停止调用
  67.             return;
  68.         }
  69.         Node<T> newPer = new Node<T>(data);
  70.         if (pan == false) {
  71.             Scanner per2 = new Scanner(System.in);
  72.             System.out.println("请输入要删除的节点角标");
  73.             int foots = per2.nextInt();
  74.             this.size--;
  75.             this.root.removeNode(foots, newPer);
  76.             return;
  77.         }
  78.         this.size++;
  79.         if (this.root == null) {
  80.             this.root = newPer;
  81.         } else {
  82.             this.root.addNode(newPer);
  83.         }
  84.     }//增加


  85.     @Deprecated
  86.     public Object[] buySome() {
  87.         this.foot = 0;
  88.         this.node = new Object[this.size];
  89.         this.root.sum();
  90.         return this.node;
  91.     }//返回详细数据

  92.     @Deprecated
  93.     public void revise() {
  94.     }//修改

  95.     @Deprecated
  96.     public void empty() {
  97.     }//清空

  98.     @Override
  99.     public void size() {
  100.         System.out.println("当前物品件数:" + this.size);
  101.     }//计算物品数量
  102. }
  103. public class Demo {
  104.     public static void main(String args[]) {
  105.         Shop<String> per = new NodeList<String>();
  106.         per.add("输出内容", true);
  107.         per.add("输出内容1", true);
  108.         per.add("输出内容2", true);
  109.         per.add("输出内容3", true);
  110.         per.add("输出内容4", true);
  111.         per.add("删除内容", false);
  112.         per.size();
  113.     }
  114. }
复制代码

这个链表我不知道应该怎么写移除方法。。。想用角标控制。。。结果越写越神奇来着。。。。然后我写的这个结构也很神奇。。。应该怎么改。。才会合理一些。。。在removeNode那个方法的位置。。不知道为什么会空指针。。。。
多谢dalao们。。。。

Oscar_W
最近课上我也刚刚学了链表,我也发表一下我的看法吧
写一个链表类NodeList,然后private Node head;   这个作为一个头结点(当然写个带表头的链表让你操作更加方便)
接着写一个新建结点的方法addNode 里面就new一个Node加上去就行了
Node就是一个结点的类,里面就是储存数据就可以了,比如T data;  Node next;之类的

看了你的代码,我就给一点点建议吧。Node是结点类,里面不要放链表的操作,Node里面放置数据内容,链表的操作放在NodeList类即可。至于删除结点的操作,你只需要从头结点开始遍历,把要删除结点的前结点指向要删除结点的后结点,即直接跳过待删除结点(注意边界情况,我不赘述),我写一个根据序号来删除的例子:
  1. public void delbyID(int no) {
  2.         if (head == null)
  3.                 return;

  4.         node p = head;
  5.         if (head.no == no) {
  6.                 head = head.next;
  7.                 return;
  8.         }
  9.         while (p.next != null) {
  10.                 if (p.next.no == no) {
  11.                         node delp = p.next;
  12.                         p.next = delp.next;
  13.                         return;
  14.                 }
  15.                 p = p.next;
  16.         }
  17. }
复制代码

如果有错误,欢迎指出

3TUSK
比较好奇为什么不直接用 Java 集合框架自带的双向链表实现 java.util.LinkedList。是学校的作业吗?

资深咸鱼
3TUSK 发表于 2020-4-9 12:29
比较好奇为什么不直接用 Java 集合框架自带的双向链表实现 java.util.LinkedList。是学校的作业吗? ...

我打算锻炼一下逻辑性。。。感觉这个链表结构很有意思。。。打算摸清楚一下。。。

洞穴夜莺
悠-零封 发表于 2020-4-9 12:35
我打算锻炼一下逻辑性。。。感觉这个链表结构很有意思。。。打算摸清楚一下。。。 ...

建议直接参考java.util.LinkedList
我觉得标准库写得都比你简洁,而且你这个foot的设定是根本没必要的而且极容易出错的
你的removeNode方法有问题(不止这个方法),你应该先在纸上画图然后再写程序

资深咸鱼
Billy12345 发表于 2020-4-9 13:01
建议直接参考java.util.LinkedList
我觉得标准库写得都比你简洁,而且你这个foot的设定是根本没必要的而 ...

emmmm,前面是纸上画图将逻辑整清楚了。。。结果后面来了个空指针。。。就全部乱套了。。越写越臃肿,不过,受教了

第一页 上一页 下一页 最后一页