• 数据结构:单向链表系列3--删除节点


    删除节点(3步操作)

    删除步骤

    1) 找到待删除节点的前驱

    2) 修改前驱节点的指针域指向待删除节点的后继节点

    3)释放待删除的节点的内存空间

    //todo:没有c#的代码添加上去。修改结构,添加一个尾部节点地址的指针

    c语言实现:

    因为链表中的每个节点都是使用malloc()动态创建的,所以需要调用free()释放待删除节点占用的内存空间。

    // A complete working C program to demonstrate deletion in singly 
    // linked list 
    #include <stdio.h> 
    #include <stdlib.h> 
    
    // A linked list node 
    struct Node 
    { 
        int data; 
        struct Node *next; 
    }; 
    
    /* Given a reference (pointer to pointer) to the head of a list 
    and an int, inserts a new node on the front of the list. */
    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; 
    } 
    
    /* Given a reference (pointer to pointer) to the head of a list 
    and a key, deletes the first occurrence of key in linked list */
    void deleteNode(struct Node **head_ref, int key) 
    { 
        // Store head node 
        struct Node* temp = *head_ref, *prev; 
    
        // If head node itself holds the key to be deleted 
        if (temp != NULL && temp->data == key) 
        { 
            *head_ref = temp->next; // Changed head 
            free(temp);             // free old head 
            return; 
        } 
    
        // Search for the key to be deleted, keep track of the 
        // previous node as we need to change 'prev->next' 
        while (temp != NULL && temp->data != key) 
        { 
            prev = temp; 
            temp = temp->next; 
        } 
    
        // If key was not present in linked list 
        if (temp == NULL) return; 
    
        // Unlink the node from linked list 
        prev->next = temp->next; 
    
        free(temp); // Free memory 
    } 
    
    // This function prints contents of linked list starting from 
    // the given node 
    void printList(struct Node *node) 
    { 
        while (node != NULL) 
        { 
            printf(" %d ", node->data); 
            node = node->next; 
        } 
    } 
    
    /* Drier program to test above functions*/
    int main() 
    { 
        /* Start with the empty list */
        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("
    Linked List after Deletion of 1: "); 
        printList(head); 
        return 0; 
    }

    因为涉及到遍历,时间复杂度O(n)

    输出

    Created Linked List: 
     2  3  1  7 
    Linked List after Deletion of 1: 
     2  3  7 

    java:

    // A complete working Java program to demonstrate deletion in singly 
    // linked list 
    class LinkedList 
    { 
        Node head; // head of list 
      
        /* Linked list Node*/
        class Node 
        { 
            int data; 
            Node next; 
            Node(int d) 
            { 
                data = d; 
                next = null; 
            } 
        } 
      
        /* Given a key, deletes the first occurrence of key in linked list */
        void deleteNode(int key) 
        { 
            // Store head node 
            Node temp = head, prev = null; 
      
            // If head node itself holds the key to be deleted 
            if (temp != null && temp.data == key) 
            { 
                head = temp.next; // Changed head 
                return; 
            } 
      
            // Search for the key to be deleted, keep track of the 
            // previous node as we need to change temp.next 
            while (temp != null && temp.data != key) 
            { 
                prev = temp; 
                temp = temp.next; 
            }     
      
            // If key was not present in linked list 
            if (temp == null) return; 
      
            // Unlink the node from linked list 
            prev.next = temp.next; 
        } 
      
        /* Inserts a new Node at front of the list. */
        public void push(int new_data) 
        { 
            Node new_node = new Node(new_data); 
            new_node.next = head; 
            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; 
            } 
        } 
      
        /* Drier program to test above functions. Ideally this function 
        should be in a separate user class. It is kept here to keep 
        code compact */
        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("
    Created Linked list is:"); 
            llist.printList(); 
      
            llist.deleteNode(1); // Delete node at position 4 
      
            System.out.println("
    Linked List after Deletion at position 4:"); 
            llist.printList(); 
        } 
    } 

     文章来源:https://www.geeksforgeeks.org/linked-list-set-3-deleting-node/

  • 相关阅读:
    函数宏实现循环左移
    函数宏判断小端
    Linux下32位与64位数据类型大小
    转:C语言嵌入式系统编程之软件架构篇
    转:详解大端小段模式
    time函数计算时间
    匈牙利命名法
    20131030
    20131029
    20131028
  • 原文地址:https://www.cnblogs.com/passedbylove/p/11439223.html
Copyright © 2020-2023  润新知