如何判断循环链表?
最优的时间复杂度,两个指针,一个快一个慢,如果遇到了就是环形。
public boolean isLoop(Node head){
Node slow = head;
Node fast = head;
while(fast!=null && fast.next!=null)
(slow = slow.next;fast = fast.next.next;
if(slow==fast)
return true;
}
return false;
单链表和循环单链表,链表为空的条件分别是?
判断是否有循环的方法:
对于任意一个节点,判断其next值是否和之前的任意节点地址相同。如果存在相同,说明有循环。
链表为空:
带头单链表:head->next==NULL
不带头单链表:list==NULL
带头循环链表:head->next==head
不带头循环链表:list==NULL
C语言链表那一块,Node * 和 *list分别是什么意思?
*LinkList那个 可以认为是typedef struct Node * LinkList; 也就是 这个*是前面那个Node的 即 LinkList 等效于Node * malloc前面的是一个强制转换 把返回值转换成Node *的类型一般的 可以这样写LinkList h = (Node *)malloc(sizeof(Node)); 也可以LinkList h = (LinkList)malloc(sizeof(Node)); 它们是等效的
真心觉得C语言链表很抽象难学,该如何学习?
我们都知道,数据结构在编程领域是一门十分重要的知识,因为程序说白了就是数据的运算,那么数据运算时建立在数据存储的基础上的。虽然现在的高级语言在日常开发中可能用不到数据结构,因为语言本身给大家提供了丰富的数据存储类型,比如说C#的List、Array、Dictionary、Queue等,又比如C++的STL,但是这并不代表我们就不需要去学习数据结构了,如果后续你需呀做到架构师,这门知识是不可或缺的。
下面小编就跟大家一起来看一下C/C++怎么去实现一个简单的单向链表,希望从中能让大家对链表有一个清晰的认识。
理解概念
说起链表,我们是不是很容易想起‘链条啊
对,没错,就是这种一节一节连接起来的链条,我们用图示将之形象化一下(画的很丑,大家别介意哈~~):
如上图,链条它每一节在物理上他其实是连续的对吧,是一节紧挨着一节。怎么样,有没有很想C/C++里的数组啊,也就是数据结构里的顺序表。但是这种不能动态增加啊,而实际开发中我们有时数组个数是不确定的,这怎么办呢?能不能用一节加一节,所以链表的概念就因此而生了。
我们能不能将链条的连接处(图上红点)断开,但是又加上某种联系,让我能通过这种联系通过前一个能够找到后一个。这样我们又想到什么?
家族比喻
这个比喻在链表中成立的先决条件是:(假设每家地址都只有前一家知道)否则就是树形结构了
这个比喻我觉得十分的适当,那就是家族。大家想,以前的家族大家都强调说住在一块,房子都是一家挨着一家的,这样的好处是我只需要知道家族的地址和你家排第几我就能找到你家对吧,但是后面改革开放了,很多人背井离乡发展,或者人多土地不够了需要去别地建房子,但是血缘不能断啊,于是我们就将各自的家庭地址互相联系,那这样,我是不是就可以这样找你,我通过你大伯知道你二伯的地址,再通过你二伯得到你家的地址,然后去家地址上是不是就能找到你父亲啦。
怎么样,这样我是不是就可以通过你大伯就能将你爸爸那一辈的所有家庭都找到啊,这就是链表。我们也用图示将之形象化:
图中一个节点分两块,一块为存放数据的数据域(家庭成员),一块为存放指向下一个结点的地址的指针称为指针域(别人家的地址)。
创建链表
接下来我们来简单的创建一个链表:
1、首先你要构造好一个节点的数据结构,为了简单,我这里就存放一个整型数据和一个指向下一节点的指针
2、创建(数据来源为输入)
代码截图并且在右上角附上了思路说明图:其实核心就在中间节点p上,首先我是让p和head指向同一块内存,这样在新增第一个节点后通过p->next = temp ;这行代码将head的头部作用确立,只要他的next指向第二个节点就可以了。这里要说一下,可能很多人不明白明明是
p->next = temp ;那为什么head->next 也会= temp,其实这就是指针的神奇之处,因为前面说过(如右上角图,此时的p和head还是指向同一个地址,在这里p->next = temp就是讲地址上的next赋值了,改变的是地址上的值,所以只要是指向这个地址的所有指针的next值都是一样的)。
好,第一个节点加进去之后,后面的照样走,循环就好了。最后需要注意的一个点是,最后一节点是没有指向的,记得将之置为空。
测试验收
我们测试一下:
运行看一下:
总结
其实,链表的概念理解起来并不难,稍微难的是难在怎么用代码去实现需要会灵活的运用指针