【问题标题】:Inserting after a particular node in a linkedlist在链表中的特定节点之后插入
【发布时间】:2015-03-13 09:12:36
【问题描述】:

这是我实现单链表的完整 Java 源代码。我看过很多教程,他们一直在谈论在开头插入节点。因此,我决定在我的代码中添加一个方法insertAfterNode(int y),我可以在其中在特定节点之后的节点内添加数据。

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package datastructures;

/**
 *
 * @author Administrator
 */
public class Link {

    int data;

    Link next;

    public Link(int d) {

        this.data = d;
    }

    public void display() {

        System.out.println(data);
    }


    public static class LinkedList {

        Link first;

        public void insertItemFirst(int x){

            Link newLink = new Link(x);

            newLink.next = first;
            first = newLink;


        }



        public Link deleteFirst() {

            Link temp = first;
            first = first.next;
            return temp;
        }

        public void displayList() {

            Link current = first;

            while (current != null) {

                current.display();
                current = current.next;

            }

        }

        // START Of METHOD


        public void insertAfterNode(int y) {

            // Considering LinkedList is Sorted
            Link newNode = new Link(y);

            Link current = first;

            while (current != null) {

                while (current.data < y) {

                    current = current.next;
                    newNode.next = current;
                    current = newNode;

                }

            }

        }





        //END Of METHOD

    }



    public static void main(String[] args) {

        LinkedList addelements = new LinkedList();

        addelements.insertItemFirst(20);
        addelements.insertItemFirst(30);
        addelements.insertItemFirst(40);
        addelements.insertItemFirst(50);
       addelements.insertAfterNode(44);



        addelements.displayList();

        System.out.println("After Calling Deletion Method Once ");

        addelements.deleteFirst();



        addelements.displayList();

    }

}

上面的代码继续在 Netbeans 中运行,我不得不停止构建以退出它。我相信我的方法实现有问题。请让我知道我的以下方法有什么问题:

 public void insertAfterNode(int y) {

            // Considering LinkedList is Sorted
            Link newNode = new Link(y);

            Link current = first;

            while (current != null) {

                while (current.data < y) {

                    current = current.next;
                    newNode.next = current;
                    current = newNode;

                }

            }

        }

没有上述方法,代码运行良好。

【问题讨论】:

  • 你的外部while loop 永远不会终止。除非您最终输入新节点,否则它不可能终止。你需要重新设计你的逻辑。
  • 在高层把这个问题分成两部分。 1. 找出想要的节点 2. 在给定节点之后插入一个新节点 阅读更多:Problems understanding concept of nodes and linked list

标签: java linked-list singly-linked-list


【解决方案1】:

仅当y 值大于current.data 时,current 链接引用才会更改。如果fist.data 是 10,y 是 5,那么您的代码将永远不会终止。

您必须修改您的while(current != null) 循环。不要使用内部的while

Link newNode = new Link(y);
// "first" requires a special treatment, as we need to replace the "first" value
if(first.data > y){
    // insert the new Link as first element
    newNode.next = first;
    first = newNode;
} else {
    // we need the previous Link, because previous.next will be set to the newNode
    Link previous = first;
    Link current = first.next;

    while (current != null) {
        if(current.data < y) {
            previous = current;
            current = current.next;
        } else {
            // we insert newNode between previous and current
            // btw. what should happen if current.data == y?
            previous.next = newNode;
            newNode.next = current;
            break; // we are done, quit the cycle
        }
    }
    // if the newNode.next is null at this point, means we have not inserted it yet.
    // insert it as the last element in the list. previous is pointing at it.
    if(newNode.next == null){
        previous.next = newNode;
    }
} // end of else

附:我希望它有效,我没有测试过代码:)

【讨论】:

    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多