有头单链表怎么变成无头单链 表 详细举例
时间: 2023-11-28 18:50:27 浏览: 33
将一个有头单链表变成无头单链表,需要做以下几个步骤:
1. 定义一个新的指针变量,指向原有头结点的下一个节点,即第一个有效节点。
2. 释放原有头结点的内存空间,使新的指针变量成为链表的新头结点。
3. 修改链表中所有节点的指针域,使它们都指向下一个节点而不是当前节点的前一个节点。
下面是一个具体的示例:
假设有一个有头单链表L,其中头结点的数据域为-1,指针域指向第一个有效节点1,而第一个有效节点1的数据域为10,指针域指向第二个有效节点2。链表中共有5个节点,最后一个节点的指针域为NULL。
```
头结点 第一个有效节点 第二个有效节点 第三个有效节点 第四个有效节点 第五个有效节点
-1 -> 1(10) -> 2(20) -> 3(30) -> 4(40) -> 5(50) -> NULL
```
现在要将这个有头单链表变成无头单链表,具体的步骤如下:
1. 定义一个新的指针变量p,指向第一个有效节点1。
2. 释放原有头结点的内存空间。
3. 修改每个节点的指针域,使它们都指向下一个节点。
代码实现如下:
```c++
// 定义有头单链表的结构体
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
// 将有头单链表变成无头单链表
ListNode* removeHead(ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
ListNode* p = head->next; // 新的头结点指向第一个有效节点
delete head; // 释放原有头结点的内存空间
head = p; // 新的头结点是第一个有效节点
while (p != NULL) { // 修改每个节点的指针域
ListNode* next = p->next;
p->next = head;
head = p;
p = next;
}
return head;
}
```
执行上述代码后,链表就变成了无头单链表,其结构如下:
```
第一个有效节点 第二个有效节点 第三个有效节点 第四个有效节点 第五个有效节点
1(10) -> 2(20) -> 3(30) -> 4(40) -> 5(50) -> NULL
```