本帖最后由 悠-零封 于 2020-4-9 10:51 编辑
复制代码
这个链表我不知道应该怎么写移除方法。。。想用角标控制。。。结果越写越神奇来着。。。。然后我写的这个结构也很神奇。。。应该怎么改。。才会合理一些。。。在removeNode那个方法的位置。。不知道为什么会空指针。。。。
多谢dalao们。。。。
- import java.util.Scanner;
- public interface Shop<T> {
- public void add(T data, boolean pan);//增加
- public Object[] buySome();//返回具体内容
- public void revise();//修改
- public void empty();//清空
- public void size();//计算物品数量
- }
- class NodeList<T> implements Shop<T> { //操作实现类
- private Node<T> root;//根节点
- private T data;//数据存储
- private int foot;//物品next计数
- private int size;//记总物品件数
- private Object [] node;
- private int x = 0;
- public NodeList() {}
- private class Node<T> {//设置泛型避免错误
- private T data;//存储数据
- private Node<T> next;
- private int foot;//物品next计数
- private Node<T> root;//根节点
- private Node<T> service;//保存上一个节点的内容
- public Node(T data) {//存储数据
- this.data = data;
- }
- public void addNode(Node<T> newPer) {//内部类处理不需要被外部调用的东西
- if (this.root == null) {
- this.root = newPer;
- } else
- if (this.next == null) {//判断next属性是否为空
- this.next = newPer;
- } else {
- this.next.addNode(newPer);//如果不是,则再测下一个next的值的值是否为空
- }
- }
- public void removeNode(int foots, Node newPer) {
- if (foots == 0) {
- this.next = this.next.next;
- }
- if (foots == x - 2) {//保存对象内容
- newPer.service = newPer.next.next;
- newPer.next = newPer.service;
- newPer.service = null;
- return;
- } else {
- x++;
- newPer.next.removeNode(foots, newPer);
- }
- }
- public void sum() {
- NodeList.this.node[this.foot++] = this.data;
- if (this.next != null) {
- this.next.sum();
- }
- }
- }
- private Node<T> getRoot() {
- return this.root;
- }
- public NodeList(T data) {
- this.data = data;
- }
- @Override
- public void add(T data, boolean pan) {//确认删出或者增加
- //外部方法确定根节点是否为空
- if (data == null) {//如果data的值为空,直接停止调用
- return;
- }
- Node<T> newPer = new Node<T>(data);
- if (pan == false) {
- Scanner per2 = new Scanner(System.in);
- System.out.println("请输入要删除的节点角标");
- int foots = per2.nextInt();
- this.size--;
- this.root.removeNode(foots, newPer);
- return;
- }
- this.size++;
- if (this.root == null) {
- this.root = newPer;
- } else {
- this.root.addNode(newPer);
- }
- }//增加
- @Deprecated
- public Object[] buySome() {
- this.foot = 0;
- this.node = new Object[this.size];
- this.root.sum();
- return this.node;
- }//返回详细数据
- @Deprecated
- public void revise() {
- }//修改
- @Deprecated
- public void empty() {
- }//清空
- @Override
- public void size() {
- System.out.println("当前物品件数:" + this.size);
- }//计算物品数量
- }
- public class Demo {
- public static void main(String args[]) {
- Shop<String> per = new NodeList<String>();
- per.add("输出内容", true);
- per.add("输出内容1", true);
- per.add("输出内容2", true);
- per.add("输出内容3", true);
- per.add("输出内容4", true);
- per.add("删除内容", false);
- per.size();
- }
- }
这个链表我不知道应该怎么写移除方法。。。想用角标控制。。。结果越写越神奇来着。。。。然后我写的这个结构也很神奇。。。应该怎么改。。才会合理一些。。。在removeNode那个方法的位置。。不知道为什么会空指针。。。。
多谢dalao们。。。。
最近课上我也刚刚学了链表,我也发表一下我的看法吧
写一个链表类NodeList,然后private Node head; 这个作为一个头结点(当然写个带表头的链表让你操作更加方便)
接着写一个新建结点的方法addNode 里面就new一个Node加上去就行了
Node就是一个结点的类,里面就是储存数据就可以了,比如T data; Node next;之类的
看了你的代码,我就给一点点建议吧。Node是结点类,里面不要放链表的操作,Node里面放置数据内容,链表的操作放在NodeList类即可。至于删除结点的操作,你只需要从头结点开始遍历,把要删除结点的前结点指向要删除结点的后结点,即直接跳过待删除结点(注意边界情况,我不赘述),我写一个根据序号来删除的例子:
复制代码
如果有错误,欢迎指出
写一个链表类NodeList,然后private Node head; 这个作为一个头结点(当然写个带表头的链表让你操作更加方便)
接着写一个新建结点的方法addNode 里面就new一个Node加上去就行了
Node就是一个结点的类,里面就是储存数据就可以了,比如T data; Node next;之类的
看了你的代码,我就给一点点建议吧。Node是结点类,里面不要放链表的操作,Node里面放置数据内容,链表的操作放在NodeList类即可。至于删除结点的操作,你只需要从头结点开始遍历,把要删除结点的前结点指向要删除结点的后结点,即直接跳过待删除结点(注意边界情况,我不赘述),我写一个根据序号来删除的例子:
- public void delbyID(int no) {
- if (head == null)
- return;
- node p = head;
- if (head.no == no) {
- head = head.next;
- return;
- }
- while (p.next != null) {
- if (p.next.no == no) {
- node delp = p.next;
- p.next = delp.next;
- return;
- }
- p = p.next;
- }
- }
如果有错误,欢迎指出

比较好奇为什么不直接用 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,前面是纸上画图将逻辑整清楚了。。。结果后面来了个空指针。。。就全部乱套了。。越写越臃肿,不过,受教了