一道考研题引发的思考~

由于最近要准备考研~开始复习《数据结构》了~所以买了一本习题集来做~上面有一道题搞得我很郁闷~

这道题是沈阳航空工业学院的真题~~

题目:在单链表、双向链表及单向循环链表中,若仅知道指向表中某个节点P,不知其头指针,能否将指针P所指节点从相应链表中删除?若可以,其时间复杂度各位多少?

书后给的答案是单链表不可以,双向链表和单向循环链表可以,时间复杂度各为O(1)和O(n),但是真的是这样的吗???

我觉得单链表完全可以~运用狸猫换太子的思想就行了~嘿嘿

一个节点都包括指针域和数据域,而删除P所指节点实际就是删除它的数据域~由于我们没有该链表的头指针,所以没有办法找到P的前驱结点,但是我们可以找到P的后继结点~这样我们可以把后继结点的数据域和P所指节点的数据域相交换~然后删除P的后继结点,然后再进行连接~完全可以达到删除P所指节点的目的~而且时间复杂度为O(1)~而且单向循环链表也可以运用这个思想,将时间复杂度降到O(1)~

void Delete(Node* p)
{
 Node* q = p->next;
 ElemType temp;
 temp = p->data;
 p->data = q->data;
 q->data = temp;
 p->next = q->next;
 free(q);
 q = NULL;
}

相似的问题还出现在了中科院的考试真题上!!

题目:假设某单循环链表非空且无头结点也无头指针,指针p指向该链表中的某个节点。请设计一个算法,将p所指节点的后继节点变为p所指向的前驱结点?

书后答案使用的是遍历找到p前驱结点的方法,时间复杂度为O(n)~其实完全可以运用刚才的思想~嘿嘿~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值