标签: linked-list

Java中的无锁并发链表

我想用一个链表像中描述的这个文件.但是,我没有在Web中找到任何Java实现.

如果没有上面提到的链表的java实现,我想,我会用的java.util.concurrent.ConcurrentLinkedQueue<E>.这是一个不错的选择(它不是一个真正的链表)?

如果它不是一个好的选择,有没有人知道Java中可靠的并发(线程安全)无等待(无锁)链接列表实现?

java concurrency linked-list

35
推荐指数
1
解决办法
4万
查看次数

如何在排序的链表上应用二进制搜索O(log n)?

最近我在链表上遇到了一个有趣的问题.给出了单独排序的列表,我们必须从该列表中搜索一个元素.

时间复杂度不应超过O(log n).这似乎我们需要在此链表上应用二进制搜索.怎么样?由于链接列表不提供随机访问,如果我们尝试应用二进制搜索算法,它将达到O(n),因为我们需要找到列表的长度并转到中间.

有任何想法吗?

algorithm linked-list binary-search asymptotic-complexity data-structures

35
推荐指数
2
解决办法
5万
查看次数

惯用效率高的Haskell追加?

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)

performance haskell linked-list append idiomatic

34
推荐指数
6
解决办法
1万
查看次数

LinkedList - 如何释放使用malloc分配的内存

我有一个非常简单的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)

c malloc free linked-list

33
推荐指数
2
解决办法
7万
查看次数

测试链表是否有循环的最佳算法

确定链表是否有循环的最佳(暂停)算法是什么?

[编辑]对时间和空间的渐近复杂性的分析将是甜蜜的,因此可以更好地比较答案.

[编辑]原始问题没有解决超过1的节点,但有一些关于它的讨论.这个问题更像是"在有向图中检测周期的最佳算法".

algorithm linked-list data-structures

32
推荐指数
1
解决办法
2万
查看次数

检测链表中循环开始的证明

从stackoverflow和outside里面的几个帖子中,我已经知道如何检测链表中的循环,循环的长度.我还找到了如何检测循环开始的方法.

以下是再次参考的步骤.

检测循环:

有两个指针,通常称为野兔和乌龟.将野兔移动2步并将龟移动1.如果它们在某个时刻相遇,那么肯定会有一个循环,并且会合点显然在循环内.

寻找循环的长度:

保持一个指针固定在会合点,同时增加另一个,直到它们再次相同.随着时间的推移增加一个计数器,满足时的计数器值将是循环的长度.

找到循环的开始

取一个指针开始列表,另一个指向会合点.现在将两者递增,并且满足点是循环的开始.我在纸上使用了一些案例验证了这种方法,但我不明白为什么它应该起作用.

有人可以提供一个数学证明,说明为什么这种方法有效吗?

algorithm linked-list

31
推荐指数
3
解决办法
2万
查看次数

linux/list.h中container_of宏背后的原理

在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)

c struct pointers linked-list linux-kernel

31
推荐指数
1
解决办法
4724
查看次数

从内存分配角度看ArrayList与LinkedList

我需要存储大量信息,例如java列表中的"名称".项目数量可以改变(或者简而言之,我不能预定义大小).我认为从内存分配的角度来看,LinkedList比ArrayList更好,对于ArrayList,一旦达到最大大小,内存分配自动加倍,因此总是有可能分配比内存更多的内存.需要什么.

我从其他帖子中了解到,存储在LinkedList中的各个元素比ArrayList占用更多空间,因为LinkedList也需要存储节点信息,但我仍然猜测我已定义的场景LinkedList可能是更好的选择.此外,我不想进入性能方面(获取,删除等),因为已经讨论过很多内容.

java collections linked-list list arraylist

31
推荐指数
3
解决办法
3万
查看次数

我怎么能用c ++创建一个列表?

如何在C++中创建列表?我需要它来创建一个链表.我该怎么做呢?我可以遵循哪些好的教程或示例?

c++ stl linked-list list

29
推荐指数
4
解决办法
17万
查看次数

MATLAB链表

MATLAB中实现链表的几种可能方法是什么?

注意:我问的是这个问题的教学价值,而不是实用价值.我意识到,如果你实际上在MATLAB中滚动自己的链表,你可能会做错事.但是,我是本学期MATLAB密集课程的助教,我提出这个问题的目的是更好地理解语言的一般结构.由于MATLAB的通用编程设备有点不寻常,我觉得这样的问题可以帮助我理解它们.

matlab linked-list data-structures

29
推荐指数
4
解决办法
4万
查看次数