c++ 删除非空的单循环链表的表尾结点。
时间: 2024-05-10 20:21:27 浏览: 11
单循环链表的表尾结点是指指向头结点的结点,因此删除表尾结点需要遍历链表找到指向头结点的前一个结点,然后将该结点的next指针指向头结点即可。
具体步骤如下:
1. 如果链表为空,直接返回。
2. 如果链表只有一个结点,将头结点置为NULL即可。
3. 遍历链表,找到指向头结点的前一个结点,记为prev。
4. 将prev的next指针指向头结点,即删除了表尾结点。
代码实现如下:
```
void deleteTailNode(Node* head) {
if (head == NULL) {
return;
}
Node* prev = head;
Node* cur = head->next;
while (cur != head) {
prev = cur;
cur = cur->next;
}
prev->next = head;
free(cur);
}
```
相关问题
删除非空的单循环链表的表尾结点。
由于单循环链表的表尾结点的下一个结点是表头结点,因此删除表尾结点需要找到倒数第二个结点。
1. 遍历链表,找到倒数第二个结点pre和最后一个结点last。
2. 将pre结点的next指针指向表头结点,即跳过last结点。
3. 释放last结点的内存空间。
代码如下:
```
void deleteLastNode(CircularLinkedList* list) {
if (list == NULL || list->head == NULL) {
return;
}
Node* pre = list->head;
Node* last = list->head;
while (last->next != list->head) {
pre = last;
last = last->next;
}
pre->next = list->head;
if (last == list->head) { // 删除的是表头结点
list->head = NULL;
}
free(last);
}
```
已知头指针 h 指向一个带头结点的非空单循环链表,结点结构为 data | next,其中 next 是指向直接后继结点的指针,p 是尾指针,q 是临时指针。现要删除该链表的第一个元素,正确的语句序列是:
1. 将 q 指向头结点的下一个结点,即 q = h->next。
2. 将头结点的 next 指针指向 q 的下一个结点,即 h->next = q->next。
3. 释放 q 结点的内存空间,即 free(q)。
4. 如果 q 恰好是尾结点,则将 p 指向头结点,即 p = h。
正确的语句序列为:
q = h->next;
h->next = q->next;
free(q);
if (q == p) {
p = h;
}