当前位置: 首页 > 知识库问答 >
问题:

在单链接列表中添加双链接列表节点

慕弘义
2023-03-14

给定单链接列表:1-

有人能建议怎么做吗?面试官给了我提示使用界面。但我不知道怎么做
我必须迭代这个链表并打印所有节点,当它到达中间时,打印next和prev指向的位置,然后打印到列表的末尾
预期输出1,2,中间:3,上一个:1,下一个:4,5

我在添加中间节点时遇到问题。


共有3个答案

杨慎之
2023-03-14

如果没有,最好定义一个lenght()函数,这样给定一个链表,就可以知道它有多少个节点。

感谢Cereal_Killer对这个答案的前一个版本的响应,我注意到这个列表首先是一个单链表,你只需要让中间节点链接到下一个节点和前一个节点。

现在,我想您已经定义了两种结构(Struct、Class或其他取决于您使用的语言的结构)。因此,假设将Node\u s定义为仅具有next指针的节点,以及同时具有nextprev指针的Node\u d。(Node\u d可能继承自Node\s,因此您只需在子类中添加prev属性)。知道了这一点,上面的代码应该能够满足您的需要:

函数do_it(my_LinkedListLinkedList){

    int i_middle;
    int length = linkedList.length();

    if ( (length ÷ 2 ) != 0 ) i_middle = length / 2;
    else return -1; 

    Node_s aux = linkedList.first();
    int index = 0;
    Node_d middle= null;

    while (aux != null) {

       if (index == i_middle - 1){ //now aux is the middle's previous node

            middle.data = aux.next.data; //aux.next is the middle singly node, we assignate the data to the new double linked node

            middle.prev = aux; //as we said, aux is the prev to the middle
            midle.next = aux.next.next; //so aux.next.next is the next to the middle
            print(what you need to print);
       }else {
            print("Node " + index " next:  "+ aux.next);
       }//end if

       index++;
       aux = aux.next;
    } //end while

}//end function

前面的代码应该执行您需要的操作。我用某种伪java代码编写了答案,因此如果您不熟悉java或不理解我的伪代码的功能,请告诉我。无论如何,我的代码的想法可能会带来一些麻烦,这取决于您使用的语言,因此您必须对其进行调整。

请注意,在该程序执行结束时,您的数据结构将不是单链接列表,也不是双链接列表,因为您将拥有linkedList。length()-1节点以明显的方式链接,但中间的节点将有两个链接。

希望这能有所帮助。

阴迪
2023-03-14

根据定义,单链接列表仅由单链接节点组成,而双链接列表仅由双链接节点组成。否则两者都不是。

根据定义,双链表的字段prev必须指向前一个元素。

不管你要建造什么。这不是很明确。因此,如果你在采访中真的被问到这个问题(并且没有误解这个问题——也许他想让你指出ghis违反了接口?)这是一个关于恐怖故事的案例http://thedailywtf.com/-“不称职的面试官”一节。

微生弘
2023-03-14

所以,这“管用”,但如果希望在面试中得到回答,那就太麻烦了。

链表

public class LinkedList {

    public interface Linkable<V, L extends Linkable> {
        V getValue();
        L getNext();
        void setNext(L link);
    }

    public static class Node implements Linkable<Integer, Linkable> {
        int value;
        Linkable next;

        Node(int value) {
            this.value = value;
        }

        @Override
        public Integer getValue() {
            return value;
        }

        @Override
        public Linkable getNext() {
            return next;
        }

        @Override
        public void setNext(Linkable link) {
            this.next = link;
        }
    }

    private Linkable head;

    public boolean isEmpty() {
        return this.head == null;
    }

    public Linkable getHead() {
        return head;
    }

    public void add(int v) {
        Node next = new Node(v);
        if (isEmpty()) {
            this.head = next;
        } else {
            Linkable tmp = this.head;
            while (tmp.getNext() != null) {
                tmp = tmp.getNext();
            }
            tmp.setNext(next);
        }
    }
}

界面

interface DoublyLinkable<V, L extends LinkedList.Linkable> extends LinkedList.Linkable<V,L> {
    LinkedList.Linkable getPrev();
    void setPrev(LinkedList.Linkable prev);
}

双节点

public class DoubleNode extends LinkedList.Node implements DoublyLinkable<Integer, LinkedList.Linkable> {
    LinkedList.Linkable prev;

    public DoubleNode(int value) {
        super(value);
    }

    @Override
    public LinkedList.Linkable getPrev() {
        return prev;
    }

    @Override
    public void setPrev(LinkedList.Linkable prev) {
         this.prev = prev;
    }
}

驾驶员

输出

1, 2, Middle: 3, Prev: 1, Next: 4, 5
public class Driver {

    public static LinkedList getList() {
        LinkedList list = new LinkedList();
        for (int i = 1; i <= 5; i++) {
            list.add(i);
        }
        return list;
    }

    public static void main(String[] args) {

        LinkedList list = getList();

        LinkedList.Linkable head = list.getHead();
        LinkedList.Linkable beforeMiddle = null;
        LinkedList.Linkable middle = list.getHead();
        LinkedList.Linkable end = list.getHead();

        if (head != null) {
            // find the middle of the list
            while (true) {
                if (end.getNext() == null || end.getNext().getNext() == null) break;

                beforeMiddle = middle;
                middle = middle.getNext();

                end = end.getNext().getNext();
            }

            // Replace middle by reassigning the pointer to it
            if (beforeMiddle != null) {

                DoubleNode n = new DoubleNode((int) middle.getValue()); // same value
                n.setPrev(list.getHead()); // point back to the front
                n.setNext(middle.getNext()); // point forward to original value

                beforeMiddle.setNext((DoublyLinkable) n);
                middle = beforeMiddle.getNext();
            }

            // Build the "expected" output
            StringBuilder sb = new StringBuilder();
            final String DELIMITER = ", ";
            head = list.getHead();
            boolean atMiddle = false;
            if (head != null) {
                do {
                    if (head instanceof DoublyLinkable) {
                        atMiddle = true;
                        String out = String.format("Middle: %d, Prev: %d, ", (int) head.getValue(), (int) ((DoublyLinkable) head).getPrev().getValue());
                        sb.append(out);
                    } else {
                        if (atMiddle) {
                            sb.append("Next: ");
                            atMiddle = false;
                        }
                        sb.append(head.getValue()).append(DELIMITER);
                    }

                    head = head.getNext();
                } while (head != null);
            }
            sb.setLength(sb.length() - DELIMITER.length());

            System.out.println(sb.toString());
        }

    }
}
 类似资料:
  • 我正在尝试使用时循环将元素添加到双向链表中。节点正在制作中,但它们都存储相同的单词,这是我正在阅读的文件的最后一个单词。这是我的时循环: 在while循环开始之前,光标被初始化为列表的开头。 这是我的节点结构: 我的时循环出了什么问题?为什么它总是覆盖以前的节点?请并谢谢你!

  • 我已经得到了实现双向链表的框架。我被PushFront()方法难住了。方法应该将提供的元素添加到链表的前面,并且应该将地址返回到新的头节点。我对如何访问列表的当前头部感到困惑,以便我可以将其分配给pNext指针。到目前为止,PushTop()方法看起来是这样的: 元素类构造函数: 数据类: 主要: 我的理解是,您通常会在调用PushFron()时提供头的地址,但是因为我没有提供,我不确定如何访问它

  • 我在课堂上有一个关于Java的作业。它是关于雇员的,所以有三个类,雇员,雇员列表和节点。我需要用这个做一个双链接列表。链表是我们定制的类,而不是Java提供的类。 现在我被困在添加(雇员)方法中。该方法输入参数一个雇员对象,并被要求添加到列表的末尾。 这是密码 简单地说,当列表为空时,该方法会将员工完美地添加到节点中,即使我将第二个员工添加到列表中,也没有问题;但当我再添加,并尝试检索它时,我最终

  • 我正在尝试创建一个函数,用于在双链接列表的末尾添加。我无法精确指出为什么它没有打印出任何内容。 当我构建程序时,没有出现错误。 我正在确定。新建节点首先检查头部是否有任何值 在上一个当前指针之后创建 我将前一个节点连接到新节点,新节点指向前一个节点,而新节点指向nullptr作为下一个节点。

  • 编写适当删除双链接列表中由(数据值14)指向的节点的代码片段。 我想我知道如何做到这一点: (1)使右侧的节点的元素指向左侧的节点 (2)使左侧的节点的元素指向右侧的节点 (3) 将指向NULL的节点元素设置为NULL并将其删除。 但是我忘记了如何用代码写这个(已经有一段时间了)。我在想它会是这样的(我假设节点是一个结构,它保存一个int数据,节点*下一个,节点*上一个): 编写代码片段以插入介于

  • 我正在尝试为一个项目创建一个双链接列表容器。我不能使用任何std容器。必须对双链接列表进行排序。以下是我目前的代码: 我遇到的问题是在我的插入函数中。我正在使用调试器,并在以下行插入代码:list.insert(10);。 它正确地进入第一种情况,即head==nullptr并创建节点。当我进入下一行代码(list.insert(20))时,它会用这一行创建一个节点:node*node=newno