数据结构:单向链表系列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("\n");
}

/* 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\n");

    printList(start);

    pairWiseSwap(start);

    printf("Linked list after calling pairwise swap function\n");

    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/

原文地址:https://www.cnblogs.com/passedbylove/p/11439473.html

时间: 2024-10-25 20:02:50

数据结构:单向链表系列6--交换相邻两个节点1(交换数据域)的相关文章

数据结构:单向链表系列8--反转链表

业务需求:给定一个指向头指针的链表,反转链表.实现过程:更改相邻节点之间的链域. 例: 输入: 1->2->3->4->NULL输出:4->3->2->1->NULL 输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL 输入: NULL输出: NULL 输入: 1->NULL输出: 1->NULL 迭代法: 空间复杂度:O(1),时间复杂度:O(n)

数据结构:单向链表系列5--在链表中查找元素

在链表中查找元素 函数签名: bool search(Node *head, int x) 如果在链表中查找到这个元素返回true,否则false 迭代法 2) 初始化一个节点指针, current = head. 3) 如果current不为NULL执行以下循环 a) current->key 等于当前待查找值key则返回true. b) current = current->next 4) 否则返回 false /*Checks whether the value key is prese

数据结构:单向链表(Linked List)

本文来源: Linked List | Set 1 (Introduction) Linked List | Set 2 (Inserting a node) Linked List | Set 3 (Deleting a node) Find Length of a Linked List (Iterative and Recursive) (todo:在结构中保持节点数信息) Search an element in a Linked List (Iterative and Recursiv

数据结构-单向链表 C和C++的实现

数据结构,一堆数据的存放方式. 今天我们学习数据结构中的 链表: 数组,大家相当熟悉的存放数据方式,而链表是数组的一种特殊方式,它每个节点包括两个部分: 数据域:存放数据,此部分与数组相同 指针域:存放了下一个节点的地址 链表比数组多了指针域,因为链表需要通过上一个节点的指针域去找下一个数据,比如有一个链表ABCD四个节点,我们要访问D里边的数据.操作如下: 先通过A节点的指针域找到B节点 再通过B节点的指针域找到C节点 再通过C节点的指针域找到D节点 获取D节点数据域的数据 对比数组直接通过下

数据结构--单向链表

C语言中,我们在使用数组时,会需要对数组进行插入和删除的操作,这时就需要移动大量的数组元素,但在C语言中,数组属于静态内存分配,数组在定义时就必须指定数组的长度或者初始化.这样程序一旦运行,数组的长度就不能再改变,若想改变,就只能修改源代码.实际使用中数组元素的个数也不能超过数组元素的最大长度,否则就会发生下标越界的错误(这是新手在初学C语言时肯定会遇到的问题,相信老师也会反复强调!!!但这种问题肯定会遇到,找半天找不到错误在哪,怪我咯???).另外如果数组元素的使用低于最大长度,又会造成系统资

数据结构-单向链表相关算法

#include <stdio.h>#include <stdlib.h>#define OVERFLOW -2#define OK 1#define ERROR 0typedef int ElemType;//单向链表结构体typedef struct LNode {    ElemType data;    struct LNode *next;}LNode,*LinkList; LinkList CreateList_L(LinkList L,int n);void Trav

数据结构和算法--3链表(单向链表、双向链表、环形单向链表和约瑟夫问题)

链表 链表是以节点的方式来存储 每个节点包含data域和next域,指向下一个节点 链表的各个节点不一定是连续存储 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 单向列表 最大特点是可以将物理地址上不连续的数据连接起来,通过指针来对物理地址进行操作,实现增删改查等功能. 单链表分为两种:有头链表和无头链表. 有头节点的增删改查 定义一个单链表的类: //定义一个SingleLinkedList,单链表,管理HeroNode class SingleLinkedList{ //初始

数据结构——求单向链表的倒数第K个节点

首先,对于链表来说,我们不能像数组一样直接访问,所以我们想到要求倒数第K个节点首先要知道最后一个节点. 然后从最后一个节点往前数K个. 最后得到想要的值. 但是这是不对的,为什么呢?因为题目给出的是单向链表,只能从前往后找. 所以我们需要换一种思路. 定两个指针. 都从链表的头开始走,一个先走一个后走,先走的比后走的快k步. 然后两个人之后每次都走一步. 当先走的走到终点的时候. 那么后走的所在的位置就是倒数第K个节点的位置了. 下面是代码,这次使用STL库中的list完成. /** *单向链表

基本数据结构:链表(list)

copy from:http://www.cppblog.com/cxiaojia/archive/2012/07/31/185760.html 基本数据结构:链表(list) 谈到链表之前,先说一下线性表.线性表是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表有两种存储方式,一种是顺序存储结构,另一种是链式存储结构. 顺序存储结构就是两个相邻的元素在内存中也是相邻的.这种存储方式的优点是