Мы обсуждали введение связанного списка и вставку связанного списка в предыдущих постах в односвязном списке.
Давайте сформулируем постановку задачи, чтобы понять процесс удаления. Получив «ключ», удалите первое вхождение этого ключа в связанном списке . Чтобы удалить узел из связанного списка, нам нужно выполнить следующие шаги. 1) Найти предыдущий узел удаляемого узла. 2) Изменить следующий из предыдущего узла. 3) Свободная память для удаляемого узла.
Поскольку каждый узел связанного списка динамически выделяется с помощью malloc () в C, нам нужно вызвать free () для освобождения памяти, выделенной для удаляемого узла.
C / C ++
#include <stdio.h>
#include <stdlib.h>
struct
Node
{
int
data;
struct
Node *next;
};
void
push(
struct
Node** head_ref,
int
new_data)
{
struct
Node* new_node = (
struct
Node*)
malloc
(
sizeof
(
struct
Node));
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
void
deleteNode(
struct
Node **head_ref,
int
key)
{
struct
Node* temp = *head_ref, *prev;
if
(temp != NULL && temp->data == key)
{
*head_ref = temp->next;
free
(temp);
return
;
}
while
(temp != NULL && temp->data != key)
{
prev = temp;
temp = temp->next;
}
if
(temp == NULL)
return
;
prev->next = temp->next;
free
(temp);
}
void
printList(
struct
Node *node)
{
while
(node != NULL)
{
printf
(
" %d "
, node->data);
node = node->next;
}
}
int
main()
{
struct
Node* head = NULL;
push(&head, 7);
push(&head, 1);
push(&head, 3);
push(&head, 2);
puts
(
"Created Linked List: "
);
printList(head);
deleteNode(&head, 1);
puts
(
"\nLinked List after Deletion of 1: "
);
printList(head);
return
0;
}
Джава
class
LinkedList
{
Node head;
class
Node
{
int
data;
Node next;
Node(
int
d)
{
data = d;
next =
null
;
}
}
void
deleteNode(
int
key)
{
Node temp = head, prev =
null
;
if
(temp !=
null
&& temp.data == key)
{
head = temp.next;
return
;
}
while
(temp !=
null
&& temp.data != key)
{
prev = temp;
temp = temp.next;
}
if
(temp ==
null
)
return
;
prev.next = temp.next;
}
public
void
push(
int
new_data)
{
Node new_node =
new
Node(new_data);
new_node.next = head;
head = new_node;
}
public
void
printList()
{
Node tnode = head;
while
(tnode !=
null
)
{
System.out.print(tnode.data+
" "
);
tnode = tnode.next;
}
}
public
static
void
main(String[] args)
{
LinkedList llist =
new
LinkedList();
llist.push(
7
);
llist.push(
1
);
llist.push(
3
);
llist.push(
2
);
System.out.println(
"\nCreated Linked list is:"
);
llist.printList();
llist.deleteNode(
1
);
System.out.println(
"\nLinked List after Deletion at position 4:"
);
llist.printList();
}
}
питон
class
Node:
def
__init__(
self
, data):
self
.data
=
data
self
.
next
=
None
class
LinkedList:
def
__init__(
self
):
self
.head
=
None
def
push(
self
, new_data):
new_node
=
Node(new_data)
new_node.
next
=
self
.head
self
.head
=
new_node
def
deleteNode(
self
, key):
temp
=
self
.head
if
(temp
is
not
None
):
if
(temp.data
=
=
key):
self
.head
=
temp.
next
temp
=
None
return
while
(temp
is
not
None
):
if
temp.data
=
=
key:
break
prev
=
temp
temp
=
temp.
next
if
(temp
=
=
None
):
return
prev.
next
=
temp.
next
temp
=
None
def
printList(
self
):
temp
=
self
.head
while
(temp):
print
" %d"
%
(temp.data),
temp
=
temp.
next
llist
=
LinkedList()
llist.push(
7
)
llist.push(
1
)
llist.push(
3
)
llist.push(
2
)
print
"Created Linked List: "
llist.printList()
llist.deleteNode(
1
)
print
"\nLinked List after Deletion of 1:"
llist.printList()
Выход:
Created Linked List:
2 3 1 7
Linked List after Deletion of 1:
2 3 7
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
Найти середину данного связанного списка в C и Java Программа для n-го узла из конца связанного списка Напишите функцию для получения N-го узла в связанном списке Учитывая только указатель / ссылку на узел, который будет удален в односвязном списке, как вы его удаляете? Определить петлю в связанном списке Напишите функцию для удаления связанного списка Напишите функцию, которая подсчитывает, сколько раз данное int встречается в связанном списке. Перевернуть связанный список Учитывая только указатель на узел, который будет удален в односвязном списке, как вы его удаляете? Напишите функцию, чтобы получить точку пересечения двух связанных списков Функция, чтобы проверить, является ли односвязный список палиндромом Большая проблема рекурсии по списку деревьев. Клонировать связанный список со следующим и случайным указателем | Комплект 1 Эффективный для памяти двусвязный список С учетом связного списка, который отсортирован, как вы будете вставлять в отсортированном виде
Связанный список | Набор 3 (удаление узла)
0.00 (0%) 0 votes