问道题,王道队列习题,假设循环单链表表示的队列长度为n,队头
数据结构吧
全部回复
仅看楼主
level 1
镜像叠加º
楼主
问道题,王道队列习题,假设循环单链表表示的队列长度为n,队头固定在链表表尾,若只设头指针,则进队时间复杂度为( )
王道上说答案是O(n)
但是如果我往头指针后面插入一个节点,形成循环,然后交换data内容,不就等于往前插了个节点吗,然后再头指针指向新节点,不就是完成了进队操作吗,这难道不是常数复杂度吗?
头指针说的应该是指向队头的指针,循环链表作队列那头节点前面的应该就是队尾了,我应该没理解错吧,总不能头指针说的是链表头吧
2020年07月26日 14点07分
1
level 1
听风new_er
我是这么理解的,这里没有说链表里的data是一个数字或字符
假设data是一个长度为m的数组,那么复杂度就是 O(m) 了 所以 O(1)并不准确
这个题目我一开始也选了 O(1),百思不得其解,看了题解才知道 “头指针”是链表头指针,我以为是队列头指针。。
2020年07月30日 15点07分
2
镜像叠加º
然后我寻思王道的答案应该就是说头指针是链表头的意思没错了…但这样的话就显得很不严谨因为队列头的指针明明也是叫头指针的,这个词前面还刚刚提到队头…而且如果是链表头那这题不就出的很没意义吗…
2020年07月31日 11点07分
镜像叠加º
第一个解释肯定不对,o(1)指的是常数级时间复杂度,也就是说计算时间不随问题规模n变化,那无论data里是什么东西,总之这个链表定义出来以后data的类型就不会变化了,那就是常数,无论多大的是数也还是常数
2020年07月31日 11点07分
听风new_er
@镜像叠加º
这个题我觉得是不严谨的,讨论区也有问这道题的,我看真题的表述都还算挺好,了解这道题答案就好了,不必过于纠结。
2020年07月31日 13点07分
听风new_er
@镜像叠加º
关于复杂度这点理解的不太对,O(1)确实是表示常数级的复杂度不随n变化,但是如果同时含有n和m,不随n变化但是可以随着m变化。 一个链表元素占用空间可以是只含一个变量的O(1)也可以是含有一个数组的O(m) 。
2020年07月31日 13点07分
level 1
lch2017123
答案的意思就是头指针是链表的头指针,但题干并没有明确说明。
2020年09月06日 13点09分
4
level 1
志喆
你应该概念混了 首先队列只能在队尾插
它这里rear肯定指向的是一个首结点不是头结点,链表尾结点一般不可能定义为头结点形式
1.如果你在rear指向的首结点前面插入一个新结点,交换值,这个符合在对尾操作,但是你可以拿到rear指向的首结点前一个元素的地址吗,你要将这个结点的next设为你新插入结点地址
2.假如你在首结点(不是头结点)后面插入新结点,你就是在队列头操作了,违背队列原则
综上你要拿到当前首结点前那一个元素地址,也就是队列尾指针(循环单链表的倒数第二个),O(N)
2020年09月22日 06点09分
5
xXXx
牛逼
2020年09月22日 07点09分
镜像叠加º
只是操作的中途利用了队列头的地址,最后在逻辑上还是将节点插在了队尾,这样肯定是没有问题的,队列只是在逻辑上不能在队头入队,至于操作的实现方法对他来说就是个黑盒不可能去在意的。何况这种做法也在其他的队列相关题目里有提到过,你这种理解方式太僵化了
2020年09月22日 12点09分
xXXx
@镜像叠加º
单链表那一块可以 是因为没有限制 队列我没见过啊 而且你这种方式 入队 很明显已经改变了人家对列入队的限制条件 你这样人家区分队头队尾有什么意义呢 你这样的话 人家完全可以头尾可以随意互换 你不就乱套了
2020年09月23日 04点09分
xXXx
@xXXx
队列的定义都可以改变 改成在队头插 队尾删除
2020年09月23日 04点09分
level 1
随心12221
头指针: 这里是链表的表头L, 不是队列的front
这里已知L,交换数据只能实现在front后, 即L前插入, 无法实现front前的插入
2020年10月14日 12点10分
6
洋洋洋洋洋😄😁
同意 相当于已知L 我们要找到front的位置
2020年11月24日 08点11分
只要你乖😈🍺
正解,相当于表尾在链表头前进行插入
2021年04月30日 11点04分
用户xxxxxxx
非常清楚
2021年08月07日 10点08分
桃子Demi🍦
非常直观了,👍
2021年11月12日 12点11分
level 1
azhengye
插入是在队尾插入,队列长度为n,链表长度未知。
头指针指向表头,表头存的是队列第二个元素,链表的n-1个节点存队尾的元素,在队尾插入即在链表的n个节点赋值。
找到的n个节点,时间复杂度为O(n),赋值时间复杂度为O(1)。进队时间复杂度为O(n)。
2020年10月28日 02点10分
8
孟德斯鸠
也就是说队头队尾都是在同一个节点,都在链表尾是吗?
2021年08月01日 03点08分
Howie000077
@孟德斯鸠
当然不对啊,正常情况是队头在表头,队尾在表尾,这个题颠倒了,队头在表尾,队尾在表头
2021年11月11日 02点11分
Howie000077
@孟德斯鸠
但无论怎么设置,插入节点一定在队尾,因为要满足队列的性质,这里队尾是表头,因为有头指针,所以O1找到表头,但要注意,这个是循环单链表啊 尾结点的指针要指向头结点或者开始结点啊,不是普通的单链表
2021年11月11日 02点11分
Howie000077
@孟德斯鸠
你插入完结点 还要修改尾结点,把它的指针指向你刚才插入的结点,所以就等于从头结点遍历单链表找到尾结点,时间复杂度是On。。
2021年11月11日 02点11分
level 1
azhengye
链表的长度可以理解为队列的最大长度。往头指针后面插入一个节点增加了链表的长度,改变了队列长度,所以不可取。
(另:链表为循环链表,链表的最后一个节点指向链表的首节点。插入节点后新节点成为的链表的首节点,此时应该使链表的尾节点指向首节点。要使尾节点指向首节点首先要找到尾节点,后将尾节点指向新节点,该操作的时间复杂度为O(x),x为链表长度。需要注意的是此操作是在队列的第一个元素后插入新元素。)
2020年10月28日 02点10分
9
镜像叠加º
……你在说什么,插入操作怎么可能不改变长度
2020年11月19日 07点11分
Grey_Spring
我觉得这里楼主的附加部分是正解 要在循环链表的头结点前插入一个元素需要更新尾节点指针的指向 而这个操作复杂度是O(n) 如果是单向链表在表头插入元素复杂度就是O(1)了
2021年07月22日 02点07分
level 8
疯狗旋风😈
我觉得先进先出,两端操作就叫队列
2020年10月28日 05点10分
10
level 1
感觉你是急了🐷
插错地方了
2021年05月27日 10点05分
11
level 1
ToLboo
所以是默认队列在链表里存储不能逆置吗,就是a3指向a2,a2指向a1这样。我以为头指针L指向的元素是队尾元素
2021年06月15日 01点06分
12
level 1
💦🌊咸鱼柒柒🐼
我不明白他的队头固定在链表尾是什么意思,队列头不应该在表头吗,如果在表尾那跟在表尾进行插入冲突啊,而且表尾一直在变,麻了看不懂
2021年09月04日 13点09分
13
level 1
sorryimmyself
楼里全是讨论头指针位置的 ,只有我懂楼主
,有标准解释了吗
2021年09月23日 11点09分
14
Howie000077
正常情况是队头在表头,队尾在表尾,这个题颠倒了,队头在表尾,队尾在表头
2021年11月11日 02点11分
Howie000077
但无论怎么设置,插入节点一定在队尾,因为要满足队列的性质,这里队尾是表头,因为有头指针,所以O1找到表头,但要注意,这个是循环单链表啊 尾结点的指针要指向头结点或者开始结点啊,不是普通的单链表
2021年11月11日 02点11分
Howie000077
你插入完结点 还要修改尾结点,把它的指针指向你刚才插入的结点,所以就等于从头结点遍历单链表找到尾结点,时间复杂度是On。 很多人都误认为这个进队列是O1了 实际上这个题无论进队出队时间复杂度都是On 因为循环单链表本来就可以有头指针的作用 它再来个头指针可以说没用
2021年11月11日 02点11分
Howie000077
我感觉我这个答案够详细了吧 群里好多说的不完全对或者不对
2021年11月11日 02点11分
level 1
丨心丶殇丿
这里的头指针到底是对链表而言还是对队列而言呀
2022年02月28日 11点02分
15
level 1
🧊🧊又凉良
楼主的意思就是把这个链表的头指针当做一个循环队列的表尾指针,从链表头每插入一个新节点,就让头指针指向这个新节点。时间复杂度为O(1)。但是你忽略了这是一个循环单链表,必须将链表的尾结点的指针域指向新插入的结点,这才完成了进队的所有操作,找到尾结点需要O(n)
2022年09月07日 18点09分
16
🧊🧊又凉良
表尾指针表述好像有点问题,改成队列尾指针吧。
2022年09月07日 18点09分
镜像叠加º
@🧊🧊又凉良
在头结点后面插一个新的,再交换数据就行了,尾节点指向原本的头结点,不用动
2022年09月08日 02点09分
🧊🧊又凉良
@镜像叠加º
你那个不是在队尾进行进队了,是在队尾之前进行进队。然后通过交换数据域改变最后两个元素的位置,虽然说结果是对的,但是过程有误,队列只允许在队尾进行进队。
2022年09月08日 08点09分
🧊🧊又凉良
@镜像叠加º
本题不设头结点,你说的应该是第一个结点吧。你的这种算法,在逻辑上是不符合队列的。我当时就一直纳闷为什么要进行数据交换,听你回复了我才明白你的意思。正常插入就是s->next=L;L=s ;然后尾结点指针=s;
2022年09月08日 08点09分
level 1
贴吧用户_5Vby8tD
题目中只给了指向链头的头指针(注意队头指针跟队尾指针是没给的,不能自己加上)
2022年09月08日 08点09分
17
1
2
尾页