一道面试题
一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?
当时我没答出来,后来问考官,它告诉我正解,大家下讨论一下。
问题点数:20、回复次数:30Top
1 楼XINYONGHUCSDN(柯风)回复于 2005-12-08 16:16:37 得分 0
将这个指针指向的next节点值copy到本节点,将next指向next->next,并随后删除原next指向的节点。Top
2 楼XINYONGHUCSDN(柯风)回复于 2005-12-08 16:17:30 得分 0
当然,其间要讲next->next暂存起来,呵呵!Top
3 楼cunsh(村少)回复于 2005-12-08 16:40:12 得分 0
楼长好主义.
mark
Top
4 楼lcd5(lcd5)回复于 2005-12-08 16:50:02 得分 0
设ListNode *p 指向链表某一节点
p->data = p->next->data;
ListNode *t = p->next;
p->next = p->next->next;
delete t;Top
5 楼iamcaicainiao(老菜,长征)回复于 2005-12-08 17:00:53 得分 0
牵强Top
6 楼feiqing8088(雨儿)回复于 2005-12-08 17:16:10 得分 0
又是慧通的吧Top
7 楼sanhill()回复于 2005-12-08 17:42:03 得分 0
的确是牵强的做法!Top
8 楼cunsh(村少)回复于 2005-12-08 17:46:08 得分 0
得不到它前面的节点.当然这里不可能把这个节点真正的删掉了.
呵呵.Top
9 楼sankt(宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒.)回复于 2005-12-08 18:42:58 得分 0
题目有问题啊
如果是单循环链表就没有问题了
typedef struct linknode
{
int data;
struct linknode *next;
}node;
void del(node *p)
{
node *q;
q=p;
while(q->next!=p)
{
q=q->next;
}
q->next=p->next;
free(p);
}
//当然还有很多细节没有考虑
大概思路就是这样
Top
10 楼2004csharp()回复于 2005-12-08 19:31:00 得分 0
面试官给的就是 XINYONGHUCSDN(柯风) 的答案Top
11 楼qiaoxiaonan(笑声爽朗)回复于 2005-12-08 20:08:35 得分 0
void del(node *p)
{
node *q;
q=p;
while(q->next!=p)
{
q=q->next;
}
q->next=p->next;
free(p);
}Top
12 楼programking(沧海一声笑)回复于 2005-12-08 20:31:41 得分 0
经典Top
13 楼speeches()回复于 2005-12-08 21:03:51 得分 0
编码的小技巧,Top
14 楼blooney(野比)回复于 2005-12-09 09:40:56 得分 0
XINYONGHUCSDN(柯风)
就是正确的嘛,怎么会说牵强呢?
呵呵,似乎很多人没发现问题的关键似的:)Top
15 楼qimans(逍遥游)回复于 2005-12-09 10:50:35 得分 0
XINYONGHUCSDN(柯风)
的答案还有问题,如果要删除的节点是最后一个节点呢?
所以要加以判断,如果p->next==NULL;则直接删除即可,不能访问p->next->next,否则出错Top
16 楼XINYONGHUCSDN(柯风)回复于 2005-12-09 12:03:49 得分 0
同意 qimans(逍遥游)
判断是要的,呵呵!这是在编程细节上考虑。
描述算法的时候只要大体描述清楚就行了!呵呵!
Top
17 楼dxabdepl()回复于 2005-12-09 12:40:25 得分 0
XINYONGHUCSDN(柯风)的答案真是经典啊
小弟自愧不如啊。。。。Top
18 楼lance_123(好好向CSDN的朋友学习!!)回复于 2005-12-09 12:53:30 得分 0
学习...Top
19 楼PHizingHelen(PHizing)回复于 2005-12-09 13:25:01 得分 0
这是数据结构的基础啦Top
20 楼qiang81020(午夜阳光)回复于 2005-12-09 13:36:49 得分 0
自己想了一下,如下:
假设X,Y,Z为连续三个节点。
则:
Y=P;
Y=X->NEXT;
Z=Y->NEXT=X->NEXT->NEXT;
然后:
让X->NEXT=Z
既:X->NEXT=X->NEXT->NEXT P=P->NEXT
删除Y节点
不知道对不对Top
21 楼qiang81020(午夜阳光)回复于 2005-12-09 13:51:24 得分 0
总感觉有什么地方不对~还望高手指点~~Top
22 楼valetine(鸣人)回复于 2005-12-09 13:54:56 得分 0
学习。。。。。。。。。。。。。
Top
23 楼codearts(代码艺术)回复于 2005-12-09 19:53:01 得分 0
假如有3个结点,1,2,3,现在p指向第3个结点(即指最后一个结点),这个时候想必没有前面的结点就不能删除了吧?
Top
24 楼codearts(代码艺术)回复于 2005-12-09 19:55:04 得分 0
假如p指向末结点,q为p的前结点
q->next = p->next; //q->next = NULL;
free(p);
没有q,又怎么能将q->next置为NULL呢?
Top
25 楼wangmao4585()回复于 2005-12-09 20:18:53 得分 0
果然菜Top
26 楼derekchuang(同舟共济)回复于 2005-12-18 12:03:27 得分 0
长见识了!!!Top
27 楼Mr_Yang(初级程序员)回复于 2005-12-18 16:22:04 得分 0
学习。Top
28 楼Duwchy(+U)回复于 2005-12-18 17:06:31 得分 0
呵呵,很经典的问题,以前听过,也想过;解决方法很巧妙,按照题目的要求,应该是最后的解决方法。。Top
29 楼Duwchy(+U)回复于 2005-12-18 17:07:21 得分 0
打错了,应该是“最后的解决方法”Top
30 楼langzi520(虽左但右)回复于 2005-12-18 17:30:06 得分 0
*p 指向链表某一节点
ListNode *t
p->data = p->next->data;
t= p;
p->next = p->next->next;
free(t);
Top




