是否有可能删除单链表中的一个中间节点,当我们唯一可用的信息是指向要删除的节点的指针,而不是指向前一个节点的指针?删除之后,前一个节点应该指向下一个节点删除节点。
我怎么能检测一个单独的链表是否有循环? 如果它有循环,那么如何find循环的起始点,即循环已经开始的节点。
如何用纯粹的function语言去做双向链表呢? 那就是Haskell,你不在Monad中,所以你没有突变。 可能吗? (单链表显然很容易)。
我在网上读了一些关于如何在链表中find一个面试问题的方法,解决scheme(Floyd的循环寻找algorithm)有两个指针,一个比另一个快两倍,然后检查他们是否再次相遇。 我的问题是:为什么我不能只固定一个指针,只要每次向前移动另一个指针?
下面的函数试图find单向链表的nth元素。 例如: 如果元素是8->10->5->7->2->1->5->4->10->10那么结果是7th到最后一个节点是7 。 任何人都可以帮助我这个代码如何工作,或者有更好更简单的方法吗? LinkedListNode nthToLast(LinkedListNode head, int n) { if (head == null || n < 1) { return null; } LinkedListNode p1 = head; LinkedListNode p2 = head; for (int j = 0; j < n – 1; ++j) { // skip n-1 steps ahead if (p2 == null) { return null; […]
这个问题可能很老,但我想不出答案。 说,有两个不同长度的列表, 合并在一个点 ; 我们如何知道合并点在哪里? 条件: 我们不知道这个长度 我们应该只parsing每个列表一次。
我很好奇,如果O(N日志)是最好的链表可以做的。
现在我一直在为一个类的Java项目工作。 它是一个链表的实现(这里叫做AddressList ,包含简单的节点叫做ListNode )。 问题是,一切都必须用recursionalgorithm来完成。 我能够做的一切都很好的方法之一: public AddressList reverse() ListNode: public class ListNode{ public String data; public ListNode next; } 现在我的reverse函数只是调用一个帮助函数,它需要一个参数来允许recursion。 public AddressList reverse(){ return new AddressList(this.reverse(this.head)); } 与我的帮助函数具有private ListNode reverse(ListNode current)的签名。 目前,我有迭代使用堆栈,但这不是规范要求。 我已经find了一个C语言的algorithm,它recursion地反转并手动将其转换为Java代码,并且它工作正常,但是我对此不了解。 编辑:没关系,我在此期间计算出来了。 private AddressList reverse(ListNode current, AddressList reversedList){ if(current == null) return reversedList; reversedList.addToFront(current.getData()); return this.reverse(current.getNext(), reversedList); } 虽然我在这里,有没有人看到这条路线的任何问题?
我已经广泛地在Java中使用链表,但是我对C ++很陌生。 我正在使用这个在项目中给我的节点类 class Node { public: Node(int data); int m_data; Node *m_next; }; 但是我有一个问题没有得到很好的回答。 为什么有必要使用 Node *m_next; 指向列表中的下一个节点而不是 Node m_next; 我明白,使用指针版本更好; 我不会去争论事实,但是我不知道为什么更好。 关于指针如何更好地分配内存,我得到了一个不太明确的答案,我想知道这里有没有人能帮助我更好地理解。
下面的两个代码示例都在链表顶部添加一个节点。 但是,第一个代码示例使用双指针,而第二个代码示例使用单个指针 代码示例1: struct node* push(struct node **head, int data) { struct node* newnode = malloc(sizeof(struct node)); newnode->data = data; newnode->next = *head; return newnode; } push(&head,1); 代码示例2: struct node* push(struct node *head, int data) { struct node* newnode = malloc(sizeof(struct node)); newnode->data = data; newnode->next = head; return newnode; } push(head,1) 两种策略都有效。 但是,很多使用链表的程序使用双指针来添加新节点。 我知道双指针是什么。 […]