链表问题

本文探讨了如何在单向链表中删除已知非尾节点,以及如何在保持链表不变的情况下,判断两个单向链表是否交叉并找到交叉点。提供了高效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.有单向链表,其中节点结构为Node{int value;Node *pNext};只知道指向某个节点的指针pCurrent;并且知道该节点不是尾节点,有什么办法把他删除吗?要求不断链. 

思路:将

pCurrent->next结点内容拷贝并覆盖掉pCurrent,删除pCurrent->next结点

void DeleteNode(node *pCurr)
 {
      Assert(pCurr != NULL);
      node * pNext = pCurr->next;
      if(pNext != NULL)
      {
            pCurr->next = pNext->next;
            pCurr->data = pNex->data;
            delete pNext;
      }
 }


2.有两个单向链表,表头pHeader1,pHeader2,请写一个函数判断这两个链表是否有交叉.如果有交叉,给出交叉点.程序不能改变链表的内容,可以使用额外的空间,时间复杂度尽量小,最好给出两种解.(双重循环的解由于时间复杂度高,不算正解).

思路:
       (1)判断是否有交叉:分别遍历两个链表得到表尾p1、p2,如果p1==p2则两个链表有交叉点,否则没有;
       (2)求交叉点(如果交叉):分别遍历链表计算两链表长度n1、n2,不妨设n1>=n2,先把pHeader1移动(n1-n2)位,再同步遍历数组,每移一位判断是否同一结点可得出结果。
时间复杂度O(n1+n2)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值