我们已经在下面的文章中讨论了循环链表和循环链表中的遍历: 循环链表简介 循环链表中的遍历 在本文中,我们将学习如何从循环链表中删除节点。考虑链表如下所示:
null
我们将得到一个节点,我们的任务是从循环链表中删除该节点。
例如:
Input : 2->5->7->8->10->(head node) data = 5Output : 2->7->8->10->(head node)Input : 2->5->7->8->10->(head node) 7Output : 2->5->8->10->(head node)
算法 案例1 :列表为空。
- 如果列表为空,我们将直接返回。
案例2 :列表不是空的
- 如果列表不是空的,那么我们定义两个指针 咖喱 和 上 并初始化指针 咖喱 和 头 节点。
- 使用 咖喱 要查找要删除的节点,并在移动到下一个节点之前,每次设置prev=curr。
- 如果找到该节点,请检查它是否是列表中唯一的节点。如果是,则设置head=NULL和free(curr)。
- 如果列表有多个节点,请检查它是否是列表的第一个节点。条件来检查这个(curr==head)。如果是,则移动上一个节点,直到到达最后一个节点。在prev到达最后一个节点后,设置head=head->next和prev->next=head。删除curr。
- 如果curr不是第一个节点,我们会检查它是否是列表中的最后一个节点。检查这个的条件是(curr->next==head)。
- 如果curr是最后一个节点。设置prev->next=head并按free(curr)删除节点curr。
- 如果要删除的节点既不是第一个节点,也不是最后一个节点,则设置prev->next=curr->next并删除curr。
完成演示循环链表中删除的程序:
C++14
// C++ program to delete a given key from // linked list. #include <bits/stdc++.h> using namespace std; /* structure for a node */ class Node { public : int data; Node* next; }; /* Function to insert a node at the beginning of a Circular linked list */ void push(Node** head_ref, int data) { // Create a new node and make head as next // of it. Node* ptr1 = new Node(); ptr1->data = data; ptr1->next = *head_ref; /* If linked list is not NULL then set the next of last node */ if (*head_ref != NULL) { // Find the node before head and update // next of it. Node* temp = *head_ref; while (temp->next != *head_ref) temp = temp->next; temp->next = ptr1; } else ptr1->next = ptr1; /*For the first node */ *head_ref = ptr1; } /* Function to print nodes in a given circular linked list */ void printList(Node* head) { Node* temp = head; if (head != NULL) { do { cout << temp->data << " " ; temp = temp->next; } while (temp != head); } cout << endl; } /* Function to delete a given node from the list */ void deleteNode(Node** head, int key) { // If linked list is empty if (*head == NULL) return ; // If the list contains only a single node if ((*head)->data==key && (*head)->next==*head) { free (*head); *head=NULL; return ; } Node *last=*head,*d; // If head is to be deleted if ((*head)->data==key) { // Find the last node of the list while (last->next!=*head) last=last->next; // Point last node to the next of head i.e. // the second node of the list last->next=(*head)->next; free (*head); *head=last->next; return ; } // Either the node to be deleted is not found // or the end of list is not reached while (last->next!=*head&&last->next->data!=key) { last=last->next; } // If node to be deleted was found if (last->next->data==key) { d=last->next; last->next=d->next; free (d); } else cout<< "no such keyfound" ; } /* Driver code */ int main() { /* Initialize lists as empty */ Node* head = NULL; /* Created linked list will be 2->5->7->8->10 */ push(&head, 2); push(&head, 5); push(&head, 7); push(&head, 8); push(&head, 10); cout << "List Before Deletion: " ; printList(head); deleteNode(&head, 7); cout << "List After Deletion: " ; printList(head); return 0; } // This is code is contributed by rathbhupendra |
C
// C program to delete a given key from // linked list. #include <stdio.h> #include <stdlib.h> /* structure for a node */ struct Node { int data; struct Node* next; }; /* Function to insert a node at the beginning of a Circular linked list */ void push( struct Node** head_ref, int data) { // Create a new node and make head as next // of it. struct Node* ptr1 = ( struct Node*) malloc ( sizeof ( struct Node)); ptr1->data = data; ptr1->next = *head_ref; /* If linked list is not NULL then set the next of last node */ if (*head_ref != NULL) { // Find the node before head and update // next of it. struct Node* temp = *head_ref; while (temp->next != *head_ref) temp = temp->next; temp->next = ptr1; } else ptr1->next = ptr1; /*For the first node */ *head_ref = ptr1; } /* Function to print nodes in a given circular linked list */ void printList( struct Node* head) { struct Node* temp = head; if (head != NULL) { do { printf ( "%d " , temp->data); temp = temp->next; } while (temp != head); } printf ( "" ); } /* Function to delete a given node from the list */ void deleteNode( struct Node* head, int key) { if (head == NULL) return ; // Find the required node struct Node *curr = head, *prev; while (curr->data != key) { if (curr->next == head) { printf ( "Given node is not found" " in the list!!!" ); break ; } prev = curr; curr = curr->next; } // Check if node is only node if (curr->next == head) { head = NULL; free (curr); return ; } // If more than one node, check if // it is first node if (curr == head) { prev = head; while (prev->next != head) prev = prev->next; head = curr->next; prev->next = head; free (curr); } // check if node is last node else if (curr->next == head && curr == head) { prev->next = head; free (curr); } else { prev->next = curr->next; free (curr); } } /* Driver code */ int main() { /* Initialize lists as empty */ struct Node* head = NULL; /* Created linked list will be 2->5->7->8->10 */ push(&head, 2); push(&head, 5); push(&head, 7); push(&head, 8); push(&head, 10); printf ( "List Before Deletion: " ); printList(head); deleteNode(head, 7); printf ( "List After Deletion: " ); printList(head); return 0; } |
JAVA
// Java program to delete a given key from // linked list. class GFG { /* ure for a node */ static class Node { int data; Node next; }; /* Function to insert a node at the beginning of a Circular linked list */ static Node push(Node head_ref, int data) { // Create a new node and make head as next // of it. Node ptr1 = new Node(); ptr1.data = data; ptr1.next = head_ref; /* If linked list is not null then set the next of last node */ if (head_ref != null ) { // Find the node before head and update // next of it. Node temp = head_ref; while (temp.next != head_ref) temp = temp.next; temp.next = ptr1; } else ptr1.next = ptr1; /*For the first node */ head_ref = ptr1; return head_ref; } /* Function to print nodes in a given circular linked list */ static void printList(Node head) { Node temp = head; if (head != null ) { do { System.out.printf( "%d " , temp.data); temp = temp.next; } while (temp != head); } System.out.printf( "" ); } /* Function to delete a given node from the list */ static Node deleteNode(Node head, int key) { if (head == null ) return null ; // Find the required node Node curr = head, prev = new Node(); while (curr.data != key) { if (curr.next == head) { System.out.printf( "Given node is not found" + " in the list!!!" ); break ; } prev = curr; curr = curr.next; } // Check if node is only node if (curr == head && curr.next == head) { head = null ; return head; } // If more than one node, check if // it is first node if (curr == head) { prev = head; while (prev.next != head) prev = prev.next; head = curr.next; prev.next = head; } // check if node is last node else if (curr.next == head) { prev.next = head; } else { prev.next = curr.next; } return head; } /* Driver code */ public static void main(String args[]) { /* Initialize lists as empty */ Node head = null ; /* Created linked list will be 2.5.7.8.10 */ head = push(head, 2 ); head = push(head, 5 ); head = push(head, 7 ); head = push(head, 8 ); head = push(head, 10 ); System.out.printf( "List Before Deletion: " ); printList(head); head = deleteNode(head, 7 ); System.out.printf( "List After Deletion: " ); printList(head); } } // This code is contributed by Arnab Kundu |
python
# Python program to delete a given key from # linked list. # Node of a doubly linked list class Node: def __init__( self , next = None , data = None ): self . next = next self .data = data # Function to insert a node at the beginning of # a Circular linked list def push(head_ref, data): # Create a new node and make head as next # of it. ptr1 = Node() ptr1.data = data ptr1. next = head_ref # If linked list is not None then set the # next of last node if (head_ref ! = None ) : # Find the node before head and update # next of it. temp = head_ref while (temp. next ! = head_ref): temp = temp. next temp. next = ptr1 else : ptr1. next = ptr1 # For the first node head_ref = ptr1 return head_ref # Function to print nodes in a given # circular linked list def printList( head): temp = head if (head ! = None ) : while ( True ) : print ( temp.data, end = " " ) temp = temp. next if (temp = = head): break print () # Function to delete a given node from the list def deleteNode( head, key) : # If linked list is empty if (head = = None ): return # If the list contains only a single node if ((head).data = = key and (head). next = = head): head = None last = head d = None # If head is to be deleted if ((head).data = = key) : # Find the last node of the list while (last. next ! = head): last = last. next # Point last node to the next of head i.e. # the second node of the list last. next = (head). next head = last. next # Either the node to be deleted is not found # or the end of list is not reached while (last. next ! = head and last. next .data ! = key) : last = last. next # If node to be deleted was found if (last. next .data = = key) : d = last. next last. next = d. next else : print ( "no such keyfound" ) return head # Driver code # Initialize lists as empty head = None # Created linked list will be 2.5.7.8.10 head = push(head, 2 ) head = push(head, 5 ) head = push(head, 7 ) head = push(head, 8 ) head = push(head, 10 ) print ( "List Before Deletion: " ) printList(head) head = deleteNode(head, 7 ) print ( "List After Deletion: " ) printList(head) # This code is contributed by Arnab Kundu |
C#
// C# program to delete a given key from // linked list. using System; class GFG { /* structure for a node */ public class Node { public int data; public Node next; }; /* Function to insert a node at the beginning of a Circular linked list */ static Node push(Node head_ref, int data) { // Create a new node and make head as next // of it. Node ptr1 = new Node(); ptr1.data = data; ptr1.next = head_ref; /* If linked list is not null then set the next of last node */ if (head_ref != null ) { // Find the node before head and update // next of it. Node temp = head_ref; while (temp.next != head_ref) temp = temp.next; temp.next = ptr1; } else ptr1.next = ptr1; /*For the first node */ head_ref = ptr1; return head_ref; } /* Function to print nodes in a given circular linked list */ static void printList(Node head) { Node temp = head; if (head != null ) { do { Console.Write( "{0} " , temp.data); temp = temp.next; } while (temp != head); } Console.Write( "" ); } /* Function to delete a given node from the list */ static Node deleteNode(Node head, int key) { if (head == null ) return null ; // Find the required node Node curr = head, prev = new Node(); while (curr.data != key) { if (curr.next == head) { Console.Write( "Given node is not found" + " in the list!!!" ); break ; } prev = curr; curr = curr.next; } // Check if node is only node if (curr.next == head && curr == head) { head = null ; return head; } // If more than one node, check if // it is first node if (curr == head) { prev = head; while (prev.next != head) prev = prev.next; head = curr.next; prev.next = head; } // check if node is last node else if (curr.next == head) { prev.next = head; } else { prev.next = curr.next; } return head; } /* Driver code */ public static void Main(String[] args) { /* Initialize lists as empty */ Node head = null ; /* Created linked list will be 2.5.7.8.10 */ head = push(head, 2); head = push(head, 5); head = push(head, 7); head = push(head, 8); head = push(head, 10); Console.Write( "List Before Deletion: " ); printList(head); head = deleteNode(head, 7); Console.Write( "List After Deletion: " ); printList(head); } } // This code has been contributed by 29AjayKumar |
Javascript
<script> // javascript program to delete a given key from // linked list. /* ure for a node */ class Node { constructor() { this .data = 0; this .next = null ; } } /* * Function to insert a node at the beginning of a Circular linked list */ function push(head_ref , data) { // Create a new node and make head as next // of it. var ptr1 = new Node(); ptr1.data = data; ptr1.next = head_ref; /* * If linked list is not null then set the next of last node */ if (head_ref != null ) { // Find the node before head and update // next of it. var temp = head_ref; while (temp.next != head_ref) temp = temp.next; temp.next = ptr1; } else ptr1.next = ptr1; /* For the first node */ head_ref = ptr1; return head_ref; } /* * Function to print nodes in a given circular linked list */ function printList(head) { var temp = head; if (head != null ) { do { document.write( temp.data+ " " ); temp = temp.next; } while (temp != head); } document.write( "<br/>" ); } /* Function to delete a given node from the list */ function deleteNode(head , key) { if (head == null ) return null ; // Find the required node var curr = head, prev = new Node(); while (curr.data != key) { if (curr.next == head) { document.write( "<br/>Given node is not found" + " in the list!!!" ); break ; } prev = curr; curr = curr.next; } // Check if node is only node if (curr == head && curr.next == head) { head = null ; return head; } // If more than one node, check if // it is first node if (curr == head) { prev = head; while (prev.next != head) prev = prev.next; head = curr.next; prev.next = head; } // check if node is last node else if (curr.next == head) { prev.next = head; } else { prev.next = curr.next; } return head; } /* Driver code */ /* Initialize lists as empty */ var head = null ; /* Created linked list will be 2.5.7.8.10 */ head = push(head, 2); head = push(head, 5); head = push(head, 7); head = push(head, 8); head = push(head, 10); document.write( "List Before Deletion: " ); printList(head); head = deleteNode(head, 7); document.write( "List After Deletion: " ); printList(head); // This code contributed by umadevi9616 </script> |
输出
List Before Deletion: 10 8 7 5 2 List After Deletion: 10 8 5 2
本文由 严酷的阿加瓦尔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END