由于最近要准备考研~开始复习《数据结构》了~所以买了一本习题集来做~上面有一道题搞得我很郁闷~
这道题是沈阳航空工业学院的真题~~
题目:在单链表、双向链表及单向循环链表中,若仅知道指向表中某个节点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)~其实完全可以运用刚才的思想~嘿嘿~