给定一个指向要删除的节点的指针,删除该节点。请注意,我们没有指向head节点的指针。
null
A. 简单解决方案 是遍历链表,直到找到要删除的节点。但是这个解决方案需要一个指向头部节点的指针,这与问题陈述相矛盾。 这个 快速解决方案 是将数据从下一个节点复制到要删除的节点并删除下一个节点。类似于下面的内容。
// Find next node using next pointer struct Node *temp = node_ptr->next; // Copy data of next node to this node node_ptr->data = temp->data; // Unlink next node node_ptr->next = temp->next; // Delete next node free(temp);
节目:
C++
#include <bits/stdc++.h> using namespace std; /* Link list node */ class Node { public : int data; Node* next; }; /* Given a reference (pointer to pointer) to the head of a list and an int, push a new node on the front of the list. */ void push(Node** head_ref, int new_data) { /* allocate node */ Node* new_node = new Node(); /* put in the data */ new_node->data = new_data; /* link the old list off the new node */ new_node->next = (*head_ref); /* move the head to point to the new node */ (*head_ref) = new_node; } void printList(Node* head) { Node* temp = head; while (temp != NULL) { cout << temp->data << " " ; temp = temp->next; } } void deleteNode(Node* node) { Node* prev; if (node == NULL) return ; else { while (node->next != NULL) { node->data = node->next->data; prev = node; node = node->next; } prev->next = NULL; } } /* Driver code*/ int main() { /* Start with the empty list */ Node* head = NULL; /* Use push() to construct below list 1->12->1->4->1 */ push(&head, 1); push(&head, 4); push(&head, 1); push(&head, 12); push(&head, 1); cout << "Before deleting " ; printList(head); /* I m deleting the head itself. You can check for more cases */ deleteNode(head); cout << "After deleting " ; printList(head); return 0; } // This is code is contributed by rathbhupendra |
C
#include <assert.h> #include <stdio.h> #include <stdlib.h> /* Link list node */ struct Node { int data; struct Node* next; }; /* Given a reference (pointer to pointer) to the head of a list and an int, push a new node on the front of the list. */ void push( struct Node** head_ref, int new_data) { /* allocate node */ struct Node* new_node = ( struct Node*) malloc ( sizeof ( struct Node)); /* put in the data */ new_node->data = new_data; /* link the old list off the new node */ new_node->next = (*head_ref); /* move the head to point to the new node */ (*head_ref) = new_node; } void printList( struct Node* head) { struct Node* temp = head; while (temp != NULL) { printf ( "%d " , temp->data); temp = temp->next; } } void deleteNode( struct Node* node) { struct Node* prev; if (node == NULL) return ; else { while (node->next != NULL) { node->data = node->next->data; prev = node; node = node->next; } prev->next = NULL; } } /* Driver program to test above function*/ int main() { /* Start with the empty list */ struct Node* head = NULL; /* Use push() to construct below list 1->12->1->4->1 */ push(&head, 1); push(&head, 4); push(&head, 1); push(&head, 12); push(&head, 1); printf ( "Before deleting " ); printList(head); /* I m deleting the head itself. You can check for more cases */ deleteNode(head); printf ( "After deleting " ); printList(head); getchar (); return 0; } |
JAVA
class LinkedList { Node head; // head of the list class Node { int data; Node next; Node( int d) { data = d; next = null ; } } /* Given a reference to the head of a list and an int, inserts a new Node on the front of the list. */ public void push( int new_data) { /* 1. alloc the Node and put the data */ Node new_Node = new Node(new_data); /* 2. Make next of new Node as head */ new_Node.next = head; /* 3. Move the head to point to new Node */ head = new_Node; } /* This function prints contents of linked list starting from the given Node */ public void printList() { Node tNode = head; while (tNode != null ) { System.out.print(tNode.data + " " ); tNode = tNode.next; } } public void deleteNode(Node Node_ptr) { Node temp = Node_ptr.next; Node_ptr.data = temp.data; Node_ptr.next = temp.next; temp = null ; } public static void main(String[] args) { LinkedList llist = new LinkedList(); /* Use push() to construct below list 1->12->1->4->1 */ llist.push( 1 ); llist.push( 4 ); llist.push( 1 ); llist.push( 12 ); llist.push( 1 ); System.out.println( "Before deleting" ); llist.printList(); /* I m deleting the head itself. You can check for more cases */ llist.deleteNode(llist.head); System.out.println( "After Deleting" ); llist.printList(); } } // This code is contributed by Rajat Mishra |
python
# a class to define a node with # data and next pointer class Node(): # constructor to initialize a new node def __init__( self , val = None ): self .data = val self . next = None # push a node to the front of the list def push(head, val): # allocate new node newnode = Node(val) # link the first node of the old list to the new node newnode. next = head. next # make the new node as head of the linked list head. next = newnode # function to print the list def print_list(head): temp = head. next while (temp ! = None ): print (temp.data, end = ' ' ) temp = temp. next print () # function to delete the node # the main logic is in this def delete_node(node): prev = Node() if (node = = None ): return else : while (node. next ! = None ): node.data = node. next .data prev = node node = node. next prev. next = None if __name__ = = '__main__' : # allocate an empty header node # this is a node that simply points to the # first node in the list head = Node() # construct the below linked list # 1->12->1->4->1 push(head, 1 ) push(head, 4 ) push(head, 1 ) push(head, 12 ) push(head, 1 ) print ( 'list before deleting:' ) print_list(head) # deleting the first node in the list delete_node(head. next ) print ( 'list after deleting: ' ) print_list(head) # This code is contributed by Adith Bharadwaj |
C#
using System; public class LinkedList { Node head; // head of the list public class Node { public int data; public Node next; public Node( int d) { data = d; next = null ; } } /* Given a reference to the head of a list and an int, inserts a new Node on the front of the list. */ public void push( int new_data) { /* 1. alloc the Node and put the data */ Node new_Node = new Node(new_data); /* 2. Make next of new Node as head */ new_Node.next = head; /* 3. Move the head to point to new Node */ head = new_Node; } /* This function prints contents of linked list starting from the given Node */ public void printList() { Node tNode = head; while (tNode != null ) { Console.Write(tNode.data + " " ); tNode = tNode.next; } } public void deleteNode(Node Node_ptr) { Node temp = Node_ptr.next; Node_ptr.data = temp.data; Node_ptr.next = temp.next; temp = null ; } // Driver code public static void Main(String[] args) { LinkedList llist = new LinkedList(); /* Use push() to construct below list 1->12->1->4->1 */ llist.push(1); llist.push(4); llist.push(1); llist.push(12); llist.push(1); Console.WriteLine( "Before deleting" ); llist.printList(); /* I m deleting the head itself. You can check for more cases */ llist.deleteNode(llist.head); Console.WriteLine( "After Deleting" ); llist.printList(); } } // This code is contributed by 29AjayKumar |
Javascript
<script> var head; // head of the list class Node { constructor(val) { this .data = val; this .next = null ; } } /* * Given a reference to the head of a list and an int, inserts a new Node on the * front of the */ function push(new_data) { /* 1. alloc the Node and put the data */ var new_Node = new Node(new_data); /* 2. Make next of new Node as head */ new_Node.next = head; /* 3. Move the head to point to new Node */ head = new_Node; } /* * This function prints contents of linked list starting from the given Node */ function printList() { var tNode = head; while (tNode != null ) { document.write(tNode.data + " " ); tNode = tNode.next; } } function deleteNode(Node_ptr) { var temp = Node_ptr.next; Node_ptr.data = temp.data; Node_ptr.next = temp.next; temp = null ; } /* * Use push() to construct below list 1->12->1->4->1 */ push(1); push(4); push(1); push(12); push(1); document.write( "Before deleting<br/>" ); printList(); /* * I m deleting the head itself. You can check for more cases */ deleteNode(head); document.write( "<br/>After Deleting <br/>" ); printList(); // This code is contributed by todaysgaurav </script> |
输出:
Before deleting 1 12 1 4 1 After deleting 12 1 4 1
时间复杂性:
要打印链接列表: O(N)
用于插入节点: O(1)
要删除节点,请执行以下操作: O(N)
辅助空间: O(1)
如果要删除的节点是列表中的最后一个节点,则此解决方案不起作用。 为了使该解决方案有效,我们可以将结束节点标记为虚拟节点。但使用此功能的程序/功能也应进行修改。 练习:用双链表试试这个问题。
函数deletenode()中的一行:
C++
void deleteNode(Node *node) { *node = *(node->next); } |
JAVA
static void deleteNode(Node node) { node = (node.next); } // This code is contributed by umadevi9616 |
蟒蛇3
def deleteNode(Node Node): Node = (Node. next ); # This code is contributed by gauravrajput1 |
C#
void deleteNode(Node *node) { *node = *(node->next); } // This code is contributed by shubhamsingh10 |
Javascript
function deleteNode(node) { node = (node.next); } // This code is contributed by gauravrajput1 </script> |
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END