我想用一个链表像中描述的这个文件.但是,我没有在Web中找到任何Java实现.
如果没有上面提到的链表的java实现,我想,我会用的java.util.concurrent.ConcurrentLinkedQueue<E>.这是一个不错的选择(它不是一个真正的链表)?
如果它不是一个好的选择,有没有人知道Java中可靠的并发(线程安全)无等待(无锁)链接列表实现?
最近我在链表上遇到了一个有趣的问题.给出了单独排序的列表,我们必须从该列表中搜索一个元素.
时间复杂度不应超过O(log n).这似乎我们需要在此链表上应用二进制搜索.怎么样?由于链接列表不提供随机访问,如果我们尝试应用二进制搜索算法,它将达到O(n),因为我们需要找到列表的长度并转到中间.
有任何想法吗?
algorithm linked-list binary-search asymptotic-complexity data-structures
List和cons运算符(:)在Haskell中非常常见.缺点是我们的朋友.但有时我想添加到列表的末尾.
xs `append` x = xs ++ [x]
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这不是实施它的有效方式.
我在Haskell中写了Pascal的三角形,但我不得不使用++ [x]反成语:
ptri = [1] : mkptri ptri
mkptri (row:rows) = newRow : mkptri rows
where newRow = zipWith (+) row (0:row) ++ [1]
Run Code Online (Sandbox Code Playgroud)
imho,这是一个可爱的可读Pascal的三角形和所有,但反成语让我烦恼.有人可以向我解释(并且,理想情况下,指向一个很好的教程)关于您想要有效追加到最后的情况下的惯用数据结构吗?我希望这个数据结构及其方法具有近似列表般的美感.或者,或者,向我解释为什么这种反成语对于这种情况实际上并不坏(如果你认为是这种情况).
[编辑]我最喜欢的答案是Data.Sequence,它确实具有"近似列表般的美丽".不确定我对操作所要求的严格程度.随时欢迎进一步的建议和不同的想法.
import Data.Sequence ((|>), (<|), zipWith, singleton)
import Prelude hiding (zipWith)
ptri = singleton 1 : mkptri ptri
mkptri (seq:seqs) = newRow : mkptri seqs
where newRow = zipWith (+) seq (0 <| seq) |> 1 …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的C代码,用于构建如下所示的单链接列表,其中我使用malloc动态地为每个节点分配内存.在代码结束时,我想为每个分配的节点释放内存,想知道如何去做 - 如果我首先从头节点开始并释放它,那么指向后续节点的指针就会丢失并发生内存泄漏.
其他方式是从头节点开始并将节点指针保存在单独的指针或其他数组中,在存储节点指针时遍历列表直到尾指针,并且一旦到达尾节点,也将其存储到另一个数组指针并开始从该数组索引向后释放,直到头节点被释放.
这是实现我想要做的唯一方法吗?
如果我不想使用第二个缓冲区,我该怎么做呢.
#include "stdio.h"
#include "stdlib.h"
struct lnk_lst
{
int val;
struct lnk_lst * next;
};
typedef struct lnk_lst item;
main()
{
item * curr, * head;
int i,desired_value;
head = NULL;
for(i=1;i<=10;i++)
{
curr = (item *)malloc(sizeof(item));
curr->val = i;
curr->next = head;
head = curr;
}
curr = head;
while(curr) {
printf("%d\n", curr->val);
curr = curr->next;
}
//How to free the memory for the nodes in this list?
for(i=1;i<=10;i++)
{
free()//?? What logic here …Run Code Online (Sandbox Code Playgroud) 确定链表是否有循环的最佳(暂停)算法是什么?
[编辑]对时间和空间的渐近复杂性的分析将是甜蜜的,因此可以更好地比较答案.
[编辑]原始问题没有解决超过1的节点,但有一些关于它的讨论.这个问题更像是"在有向图中检测周期的最佳算法".
从stackoverflow和outside里面的几个帖子中,我已经知道如何检测链表中的循环,循环的长度.我还找到了如何检测循环开始的方法.
以下是再次参考的步骤.
检测循环:
有两个指针,通常称为野兔和乌龟.将野兔移动2步并将龟移动1.如果它们在某个时刻相遇,那么肯定会有一个循环,并且会合点显然在循环内.
寻找循环的长度:
保持一个指针固定在会合点,同时增加另一个,直到它们再次相同.随着时间的推移增加一个计数器,满足时的计数器值将是循环的长度.
找到循环的开始
取一个指针开始列表,另一个指向会合点.现在将两者递增,并且满足点是循环的开始.我在纸上使用了一些案例验证了这种方法,但我不明白为什么它应该起作用.
有人可以提供一个数学证明,说明为什么这种方法有效吗?
在linux内核列表的实现中/include/linux/list.h,container_of宏的第一行(下面粘贴)背后的基本原理是什么?
const typeof( ((type *)0)->member ) *__mptr = (ptr);
Run Code Online (Sandbox Code Playgroud)
在我的示例代码中,我删除了这一行并将定义更改为
#define container_of(ptr, type, member) ({ \
(type *)( (char *)ptr - offsetof(type,member) );})
Run Code Online (Sandbox Code Playgroud)
我的代码仍显示预期的结果.那么第一行是多余的吗?或者它有一些我不知道的隐藏陷阱?
我在Faq/LinkedLists找到的代码
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
*
*/
#define container_of(ptr, type, …Run Code Online (Sandbox Code Playgroud) 我需要存储大量信息,例如java列表中的"名称".项目数量可以改变(或者简而言之,我不能预定义大小).我认为从内存分配的角度来看,LinkedList比ArrayList更好,对于ArrayList,一旦达到最大大小,内存分配自动加倍,因此总是有可能分配比内存更多的内存.需要什么.
我从其他帖子中了解到,存储在LinkedList中的各个元素比ArrayList占用更多空间,因为LinkedList也需要存储节点信息,但我仍然猜测我已定义的场景LinkedList可能是更好的选择.此外,我不想进入性能方面(获取,删除等),因为已经讨论过很多内容.
如何在C++中创建列表?我需要它来创建一个链表.我该怎么做呢?我可以遵循哪些好的教程或示例?
linked-list ×10
algorithm ×3
c ×2
java ×2
list ×2
append ×1
arraylist ×1
c++ ×1
collections ×1
concurrency ×1
free ×1
haskell ×1
idiomatic ×1
linux-kernel ×1
malloc ×1
matlab ×1
performance ×1
pointers ×1
stl ×1
struct ×1