《编程之美》3.4 从无头单链表中删除/添加节点

本文介绍了在没有头指针的单链表中如何删除指定节点及如何在指定节点前插入新节点的方法。通过巧妙地利用节点之间的连接关系,实现了在不知道前驱节点的情况下完成节点的删除与插入。

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

题目:
假设有一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(非第一个节点, 也非最后一个节点)。请将该节点从单链表中删除。

解答:
典型的“狸猫换太子”, 若要删除该节点,正常情况下,应该要知道该节点的前面节点的指针,但是由于单链表中没有提供头指针,所以无法追溯到该节点前面的那个节点,因此,这里采用了“移花接木”的方法。设该节点为B,下一个节点为C。那么,首先将B节点的内容替换为C节点的内容,然后,将C节点删除,这样就达到了我们的目的。代码如下:

pCur->next = pNext->next;

pCur->data = pNext->data;

delete pNext;

代码:

void DeleteListNode(node* pCurrent)   
{       
 assert(pCurrent != NULL);       
 node* pNext = pCurrent -> next;      
 if (pNext == NULL)       
  pCurrent = NULL;     
 else   
 {      
  pCurrent -> next = pNext -> next;   
  pCurrent -> data = pNext -> data;    
  delete pNext;      
 }
}

类似问题:
http://hi.baidu.com/liangrt_fd/blog/item/4deb905028aa0c55d00906da.html

题目:
1、 从无头单链表中删除节点问题:假设有一个没有头指针的单链表,一个指针p指向单链表中的一个节点(不是第一个,也不是最后一个),请将该节点删除掉。

2、 向无头单链表中添加节点问题:假设有一个没有头指针的单链表,一个指针p指向单链表中的一个节点(不是第一个,也不是最后一个),请在该节点之前插入一个新的节点q。

分析:
由于链表是无头单向链表,所以我们无法由当前节点获得p的前一节点,而无论是删除当前节点还是向前面节点插入新节点都需要获得p的前一节点。在这里我们不妨换一下思路,对当前节点的后继结点进行操作,然后将前后节点的数据进行适当交换也可以得到相应效果。

解决方案:
问题1解法:将p后继结点p->next的数据拷贝到p,然后删除p->next,这样就达到了相同的效果,代码如下:

ListNode* p_next = p->next;

p->data=p_next->data;

p->next=p_next->next;

delete   p_next;

问题2解法:在p节点后添加q,然后交换p和q的数据即可。

q->next=p->next;

p->next=q;

swap(&p->data, &q->data);
<think>我们首先需要解析用户提供的代码片段。用户给出了两行代码,都是关于科学计数法的赋值语句。 第一行:a=3.4e+2; 表示3.4乘以10的2次方,即340。 第二行:a=3.4e-2; 表示3.4乘以10的-2次方,即0.034。 但是,用户并没有提出具体的问题。根据上下文,用户可能是在展示科学计数法的表示方式,或者希望我们解释这些代码。 由于用户要求我们作为编程专家,并会向我们提问各个编程领域的相关问题,我们可以假设用户希望我们解释科学计数法在编程中的使用。 因此,我们可以这样回答: 在编程中,科学计数法是一种表示非常大或非常小的数字的方法。它使用字母e或E来表示10的幂次。 例如: 3.4e+2 等同于 3.4 * 10^2 = 340 3.4e-2 等同于 3.4 * 10^(-2) = 0.034 科学计数法在编程中广泛使用,特别是在处理浮点数时。 由于用户没有明确问题,我们可以主动提供一些关于科学计数法的解释,并给出示例代码(比如在不同语言中的使用)。 但是,根据用户提供的回答流程,我们需要先回答问题,然后给出解释,最后提出相关问题。 然而,用户并没有提出具体问题,所以我们可以将问题理解为:解释这两行代码的含义,并展示科学计数法在编程中的使用。 因此,我们可以这样组织回答: 回答: 您提供的两行代码是使用科学计数法为变量a赋值的示例。在编程中,科学计数法用于表示极大或极小的浮点数。 代码解释: 第一行:a=3.4e+2; // 将340赋值给a 第二行:a=3.4e-2; // 将0.034赋值给a 科学计数法的格式通常为:<尾数>e<指数>,其中指数可以是正数或负数,表示10的幂次。 为了更全面地说明,我们可以用多种编程语言展示科学计数法的使用。 示例代码(使用多种语言): 1. Python: ```python a = 3.4e+2 # a = 340.0 b = 3.4e-2 # b = 0.034 print(a, b) # 输出:340.0 0.034 ``` 2. Java: ```java public class Main { public static void main(String[] args) { double a = 3.4e+2; // a = 340.0 double b = 3.4e-2; // b = 0.034 System.out.println(a + " " + b); // 输出:340.0 0.034 } } ``` 3. C++: ```cpp #include <iostream> using namespace std; int main() { double a = 3.4e+2; // 340.0 double b = 3.4e-2; // 0.034 cout << a << " " << b << endl; // 输出:340 0.034 return 0; } ``` 4. JavaScript: ```javascript let a = 3.4e+2; // 340 let b = 3.4e-2; // 0.034 console.log(a, b); // 输出:340 0.034 ``` 5. C#: ```csharp using System; class Program { static void Main() { double a = 3.4e+2; // 340.0 double b = 3.4e-2; // 0.034 Console.WriteLine($"{a} {b}"); // 输出:340 0.034 } } ``` 注意:在强类型语言中,科学计数法表示的数值通常被识别为浮点数(如float或double)。在弱类型语言(如JavaScript)中,它也是作为浮点数处理。 解释: 科学计数法在编程中非常有用,尤其是在处理非常大或非常小的数值时,例如物理常数、天文数字或微观尺度。使用科学计数法可以避免书写很多零,提高可读性。 最后,按照要求,我们需要提出相关问题: §§相关问题§§: 1. 科学计数法在编程中还有哪些应用场景? 2. 科学计数法表示的数在内存中是如何存储的? 3.编程中,科学计数法能否用于整数?为什么? 4. 如何避免科学计数法在浮点数运算中可能带来的精度问题? 注意:请严格按照格式输出。</think>您展示的代码片段展示了编程中科学计数法的使用,用于简洁表示极大或极小的数值。以下是详细解释和示例: ### 代码解释 ```plaintext a = 3.4e+2; // 等价于 3.4 × 10² = 340 a = 3.4e-2; // 等价于 3.4 × 10⁻² = 0.034 ``` - **`e`/`E`**:表示"指数"(exponent),连接底数和幂次 - **`+`/`-`**:表示正/负指数(`+`可省略,如 `3.4e2`) - 所有语言中科学计数法默认解析为**浮点数类型**(如 Python 的 `float`,Java 的 `double`) ### 多语言示例 #### Python ```python # 科学计数法赋值 b = 2.5e3 # 2500.0 c = 1.6e-5 # 0.000016 # 运算与输出 result = b * c # 2500 * 0.000016 = 0.04 print(f"{result:.1e}") # 格式化为科学计数法输出: 4.0e-02 ``` #### Java ```java public class ScientificNotation { public static void main(String[] args) { double d = 9.8e+7; // 98000000.0 double e = 4.2E-3; // 0.0042 (E与e等效) System.out.println(d / 1e5); // 输出: 980.0 System.out.println(String.format("%.2e", e)); // 输出: 4.20e-03 } } ``` #### C++ ```cpp #include <iostream> #include <iomanip> using namespace std; int main() { float f = 6.022e23f; // 阿伏伽德罗常数 double d = 1.602e-19; // 电子电荷量 cout << "分子数: " << fixed << f << endl; // 完整输出 cout << "单个电荷: " << scientific << d << endl; // 科学计数法输出 return 0; } ``` ### 关键注意事项 1. **类型推断**:科学计数法始终解析为浮点类型(非整数) 2. **精度问题**:极大/极小数可能存在浮点精度误差(如 `0.1 + 0.2 != 0.3`) 3. **跨语言一致性**:所有主流语言语法相同(C/C++/Java/Python/JS 等) 4. **输出格式化**:可用 `printf("%.3e", val)` 或格式字符串控制输出形式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值