![](/img/trans.png)
[英]Delete the last node of a single linked list using the single pointer to start node
[英]Delete last node of single linked list using tail pointer
我正在C中创建一个单链列表,该列表具有头和尾指针,其中头指针指向SLL的起始节点,尾指针指向SLL的最后节点。 我不想使用头指针删除该节点,直到列表的末尾。 有没有办法让我可以使用尾指针删除SLL的最后一个元素?
以下是节点添加功能。 头部和尾部都初始化为NULL。
void add_node_last(Node** head, Node** tail, int data) {
Node* new_node = (Node *) malloc(sizeof(Node));
new_node -> data = data;
new_node -> ptr = NULL;
if(*head == NULL && *tail == NULL) {
*head = new_node;
*tail = new_node;
return;
}
(*tail) -> ptr = new_node;
*tail = new_node;
}
要删除第一个节点,请使用以下功能:
void del_first(Node **head) {
if(*head == NULL) {
return;
}
*head = (*head) -> ptr;
free(*head);
}
您可以释放节点的内存,但只能释放一次。 第一次删除后,尾指针以及倒数第二个节点的ptr
将是无效的指针。 为了确保两个指针始终正确,您要么需要遍历整个列表,要么使其成为双链表。
这是一个很长的道歉(感谢@stark)。
为了在不使其成为双向链接列表的情况下工作,您可以使尾部的* next指针指向列表的开头,然后遍历它直到到达尾部之前的节点。 一旦到达那里,您可以将其* next指针为NULL,这实际上会将原始尾部从列表中分离出来。 然后将尾部设置为当前节点,然后最终释放原始尾部。
void del_last(Node **head, Node **tail) {
struct node *new_head = *head;
struct node *current = *tail;
current->next = head;
while(current-> != *tail) //getting the node right before the original tail
{
current = current->next
}
current->next = NULL; //detaches original tail form list
free(**tail); //gets rid of original tail
**tail = current; // sets current node to tail pointer
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.