zoukankan      html  css  js  c++  java
  • 数据结构:单向链表系列6--交换相邻两个节点1(交换数据域)

    给定一个单向链表,编写函数交换相邻 两个元素

    输入: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7

    输出: 2 -> 1 -> 4 -> 3 -> 6 -> 5 -> 7

    输入: 1 -> 2 -> 3 -> 4 -> 5 -> 6

    输出: 2 -> 1 -> 4 -> 3 -> 6 -> 5

    通过观察发现:当输入的与元素个数是单数的时候,最后一位不参与交换。 

    方法1(迭代)

    从头节点开始遍历列表,遍历过程中使用每个节点的下一个节点和当前节点的数据进行交换。

    时间复杂度:O(n)

    实现过程:

    c语言

    /* C Program to pairwise swap elements in a given linked list */
    #include <stdio.h>
    #include <stdlib.h>
    
    /* A linked list node*/
    struct Node {
        int data;
        struct Node* next;
    };
    
    
    /* Function to swap two integers at addresses a and b */
    void swap(int *a, int *b);
    
    /* Function to pairwise swap elements of a linked list */
    void pairWiseSwap(struct Node* head)
    {
        struct Node* temp = head;
    
        /* Traverse further only if there are at-least two nodes left */
        while( temp != NULL && temp->next != NULL)
        {
            /* Swap data of node with its next node's data */
            swap(&temp->data, &temp->next->data);
    
            /* Move temp by 2 for the next pair*/
            temp = temp->next->next;
        }
    }
    
    /* Utility functions */
    /* function to swap two integers */
    void swap(int *a, int *b)
    {
        int temp;
        temp = *a;
        *a = *b;
        *b = temp;
    }
    
    
    /* Funtion to add a node at the beginning of Linked 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;
    }
    
    
    /* function to print nodes in a given linked list */
    void printList(struct Node* node)
    {
        while( node != NULL )
        {
            printf("%d ", node->data);
            node = node->next;
        }
        printf("
    ");
    }
    
    
    /* driver program to test above function */
    int main() {
    
        struct Node* start = NULL;
    
        /*
            the constructed linked list is:
            1 -> 2 -> 3 -> 4 -> 5
         */
        push(&start ,5);
        push(&start, 4);
        push(&start, 3);
        push(&start, 2);
        push(&start, 1)    ;
    
        printf("Linked list before calling pairwise swap function
    ");
    
        printList(start);
    
        pairWiseSwap(start);
    
        printf("Linked list after calling pairwise swap function
    ");
    
        printList(start);
    
        return 0;
    }

    结果

     java代码:

    // Java program to pairwise swap elements of a 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; 
            } 
        } 
      
        void pairWiseSwap() 
        { 
            Node temp = head; 
      
            /* Traverse only till there are atleast 2 nodes left */
            while (temp != null && temp.next != null) { 
      
                /* Swap the data */
                int k = temp.data; 
                temp.data = temp.next.data; 
                temp.next.data = k; 
                temp = temp.next.next; 
            } 
        } 
      
        /* Utility functions */
      
        /* Inserts a new Node at front of the list. */
        public void push(int new_data) 
        { 
            /* 1 & 2: Allocate the Node & 
                      Put in the data*/
            Node new_node = new Node(new_data); 
      
            /* 3. Make next of new Node as head */
            new_node.next = head; 
      
            /* 4. Move the head to point to new Node */
            head = new_node; 
        } 
      
        /* Function to print linked list */
        void printList() 
        { 
            Node temp = head; 
            while (temp != null) { 
                System.out.print(temp.data + " "); 
                temp = temp.next; 
            } 
            System.out.println(); 
        } 
      
        /* Driver program to test above functions */
        public static void main(String args[]) 
        { 
            LinkedList llist = new LinkedList(); 
      
            /* Created Linked List 1->2->3->4->5 */
            llist.push(5); 
            llist.push(4); 
            llist.push(3); 
            llist.push(2); 
            llist.push(1); 
      
            System.out.println("Linked List before calling pairWiseSwap() "); 
            llist.printList(); 
      
            llist.pairWiseSwap(); 
      
            System.out.println("Linked List after calling pairWiseSwap() "); 
            llist.printList(); 
        } 
    } 
    /* This code is contributed by Rajat Mishra */

    c#代码

    // C# program to pairwise swap elements of a linked list 
    using System; 
    class LinkedList { 
        Node head; // head of list 
      
        /* Linked list Node*/
        public class Node { 
            public int data; 
            public Node next; 
            public Node(int d) 
            { 
                data = d; 
                next = null; 
            } 
        } 
      
        void pairWiseSwap() 
        { 
            Node temp = head; 
      
            /* Traverse only till there are atleast 2 nodes left */
            while (temp != null && temp.next != null) { 
      
                /* Swap the data */
                int k = temp.data; 
                temp.data = temp.next.data; 
                temp.next.data = k; 
                temp = temp.next.next; 
            } 
        } 
      
        /* Utility functions */
      
        /* Inserts a new Node at front of the list. */
        public void push(int new_data) 
        { 
            /* 1 & 2: Allocate the Node &  
                    Put in the data*/
            Node new_node = new Node(new_data); 
      
            /* 3. Make next of new Node as head */
            new_node.next = head; 
      
            /* 4. Move the head to point to new Node */
            head = new_node; 
        } 
      
        /* Function to print linked list */
        void printList() 
        { 
            Node temp = head; 
            while (temp != null) { 
                Console.Write(temp.data + " "); 
                temp = temp.next; 
            } 
            Console.WriteLine(); 
        } 
      
        /* Driver program to test above functions */
        public static void Main(String[] args) 
        { 
            LinkedList llist = new LinkedList(); 
      
            /* Created Linked List 1->2->3->4->5 */
            llist.push(5); 
            llist.push(4); 
            llist.push(3); 
            llist.push(2); 
            llist.push(1); 
      
            Console.WriteLine("Linked List before calling pairWiseSwap() "); 
            llist.printList(); 
      
            llist.pairWiseSwap(); 
      
            Console.WriteLine("Linked List after calling pairWiseSwap() "); 
            llist.printList(); 
        } 
    } 
    // This code is contributed by Arnab Kundu 

     方法2(递归)

     如果链表中含有两个以上节点,先交换前两个节点,然后递归调用剩下的节点

    时间复杂度:O(n)

    算法主要部分代码

    /* Recursive function to pairwise swap elements 
       of a linked list */
    void pairWiseSwap(struct node* head) 
    { 
        /* There must be at-least two nodes in the list */
        if (head != NULL && head->next != NULL) { 
      
            /* Swap the node's data with data of next node */
            swap(&head->data, &head->next->data); 
      
            /* Call pairWiseSwap() for rest of the list */
            pairWiseSwap(head->next->next); 
        } 
    } 

    以上代码只是交换数据域部分的指针,如果一个节点含有很多字段,将会产生频繁的交换动作。

    其他方法:数据结构:单向链表系列7--交换相邻两个节点2

    文章来源:https://www.geeksforgeeks.org/pairwise-swap-elements-of-a-given-linked-list/

  • 相关阅读:
    SQL注入攻击
    Collections使用
    jquery实现table按时间排序
    浏览器存储及使用
    android实现屏幕旋转切换fragment
    安卓保存图片到图库demo总结
    android service基础
    正则表达式学习总结
    注解和枚举回顾
    Vue+Element项目日期选择器类型转化的问题
  • 原文地址:https://www.cnblogs.com/passedbylove/p/11439473.html
Copyright © 2011-2022 走看看