📌  相关文章
📜  交换链表中的节点而不交换数据

📅  最后修改于: 2022-05-13 01:57:43.964000             🧑  作者: Mango

交换链表中的节点而不交换数据

给定一个链表和其中的两个键,交换两个给定键的节点。应通过更改链接来交换节点。当数据包含许多字段时,在许多情况下交换节点的数据可能会很昂贵。

可以假设链表中的所有键都是不同的。

例子:

Input : 10->15->12->13->20->14,  x = 12, y = 20
Output: 10->15->20->13->12->14

Input : 10->15->12->13->20->14,  x = 10, y = 20
Output: 20->15->12->13->10->14

Input : 10->15->12->13->20->14,  x = 12, y = 13
Output: 10->15->13->12->20->14

这可能看起来是一个简单的问题,但这是一个有趣的问题,因为它有以下情况需要处理。

  1. x 和 y 可能相邻也可能不相邻。
  2. x 或 y 都可以是头节点。
  3. x 或 y 可能是最后一个节点。
  4. x 和/或 y 可能不存在于链表中。

如何编写一个干净的工作代码来处理上述所有可能性。



这个想法是首先在给定的链表中搜索 x 和 y。如果其中任何一个不存在,则返回。在搜索 x 和 y 时,跟踪当前和以前的指针。首先更改前一个指针的下一个,然后更改当前指针的下一个。

下面是上述方法的实现。

C++
/* This program swaps the nodes of linked list rather
than swapping the field from the nodes.*/
#include 
using namespace std;
 
/* A linked list node */
class Node {
public:
    int data;
    Node* next;
};
 
/* Function to swap nodes x and y in linked list by
changing links */
void swapNodes(Node** head_ref, int x, int y)
{
    // Nothing to do if x and y are same
    if (x == y)
        return;
 
    // Search for x (keep track of prevX and CurrX
    Node *prevX = NULL, *currX = *head_ref;
    while (currX && currX->data != x) {
        prevX = currX;
        currX = currX->next;
    }
 
    // Search for y (keep track of prevY and CurrY
    Node *prevY = NULL, *currY = *head_ref;
    while (currY && currY->data != y) {
        prevY = currY;
        currY = currY->next;
    }
 
    // If either x or y is not present, nothing to do
    if (currX == NULL || currY == NULL)
        return;
 
    // If x is not head of linked list
    if (prevX != NULL)
        prevX->next = currY;
    else // Else make y as new head
        *head_ref = currY;
 
    // If y is not head of linked list
    if (prevY != NULL)
        prevY->next = currX;
    else // Else make x as new head
        *head_ref = currX;
 
    // Swap next pointers
    Node* temp = currY->next;
    currY->next = currX->next;
    currX->next = temp;
}
 
/* Function to add a node at the beginning of 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;
}
 
/* Function to print nodes in a given linked list */
void printList(Node* node)
{
    while (node != NULL) {
        cout << node->data << " ";
        node = node->next;
    }
}
 
/* Driver program to test above function */
int main()
{
    Node* start = NULL;
 
    /* The constructed linked list is:
    1->2->3->4->5->6->7 */
    push(&start, 7);
    push(&start, 6);
    push(&start, 5);
    push(&start, 4);
    push(&start, 3);
    push(&start, 2);
    push(&start, 1);
 
    cout << "Linked list before calling swapNodes() ";
    printList(start);
 
    swapNodes(&start, 4, 3);
 
    cout << "\nLinked list after calling swapNodes() ";
    printList(start);
 
    return 0;
}
 
// This is code is contributed by rathbhupendra


C
/* This program swaps the nodes of linked list rather
   than swapping the field from the nodes.*/
 
#include 
#include 
 
/* A linked list node */
struct Node {
    int data;
    struct Node* next;
};
 
/* Function to swap nodes x and y in linked list by
   changing links */
void swapNodes(struct Node** head_ref, int x, int y)
{
    // Nothing to do if x and y are same
    if (x == y)
        return;
 
    // Search for x (keep track of prevX and CurrX
    struct Node *prevX = NULL, *currX = *head_ref;
    while (currX && currX->data != x) {
        prevX = currX;
        currX = currX->next;
    }
 
    // Search for y (keep track of prevY and CurrY
    struct Node *prevY = NULL, *currY = *head_ref;
    while (currY && currY->data != y) {
        prevY = currY;
        currY = currY->next;
    }
 
    // If either x or y is not present, nothing to do
    if (currX == NULL || currY == NULL)
        return;
 
    // If x is not head of linked list
    if (prevX != NULL)
        prevX->next = currY;
    else // Else make y as new head
        *head_ref = currY;
 
    // If y is not head of linked list
    if (prevY != NULL)
        prevY->next = currX;
    else // Else make x as new head
        *head_ref = currX;
 
    // Swap next pointers
    struct Node* temp = currY->next;
    currY->next = currX->next;
    currX->next = temp;
}
 
/* Function to add a node at the beginning of 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;
    }
}
 
/* Driver program to test above function */
int main()
{
    struct Node* start = NULL;
 
    /* The constructed linked list is:
     1->2->3->4->5->6->7 */
    push(&start, 7);
    push(&start, 6);
    push(&start, 5);
    push(&start, 4);
    push(&start, 3);
    push(&start, 2);
    push(&start, 1);
 
    printf("\n Linked list before calling swapNodes() ");
    printList(start);
 
    swapNodes(&start, 4, 3);
 
    printf("\n Linked list after calling swapNodes() ");
    printList(start);
 
    return 0;
}


Java
// Java program to swap two given nodes of a linked list
 
class Node {
    int data;
    Node next;
    Node(int d)
    {
        data = d;
        next = null;
    }
}
 
class LinkedList {
    Node head; // head of list
 
    /* Function to swap Nodes x and y in linked list by
       changing links */
    public void swapNodes(int x, int y)
    {
        // Nothing to do if x and y are same
        if (x == y)
            return;
 
        // Search for x (keep track of prevX and CurrX)
        Node prevX = null, currX = head;
        while (currX != null && currX.data != x) {
            prevX = currX;
            currX = currX.next;
        }
 
        // Search for y (keep track of prevY and currY)
        Node prevY = null, currY = head;
        while (currY != null && currY.data != y) {
            prevY = currY;
            currY = currY.next;
        }
 
        // If either x or y is not present, nothing to do
        if (currX == null || currY == null)
            return;
 
        // If x is not head of linked list
        if (prevX != null)
            prevX.next = currY;
        else // make y the new head
            head = currY;
 
        // If y is not head of linked list
        if (prevY != null)
            prevY.next = currX;
        else // make x the new head
            head = currX;
 
        // Swap next pointers
        Node temp = currX.next;
        currX.next = currY.next;
        currY.next = temp;
    }
 
    /* Function to add Node at beginning of 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;
        }
    }
 
    /* Driver program to test above function */
    public static void main(String[] args)
    {
        LinkedList llist = new LinkedList();
 
        /* The constructed linked list is:
            1->2->3->4->5->6->7 */
        llist.push(7);
        llist.push(6);
        llist.push(5);
        llist.push(4);
        llist.push(3);
        llist.push(2);
        llist.push(1);
 
        System.out.print(
            "\n Linked list before calling swapNodes() ");
        llist.printList();
 
        llist.swapNodes(4, 3);
 
        System.out.print(
            "\n Linked list after calling swapNodes() ");
        llist.printList();
    }
}
// This code is contributed by Rajat Mishra


Python
# Python program to swap two given nodes of a linked list
class LinkedList(object):
    def __init__(self):
        self.head = None
 
    # head of list
    class Node(object):
        def __init__(self, d):
            self.data = d
            self.next = None
 
    # Function to swap Nodes x and y in linked list by
    # changing links
    def swapNodes(self, x, y):
 
        # Nothing to do if x and y are same
        if x == y:
            return
 
        # Search for x (keep track of prevX and CurrX)
        prevX = None
        currX = self.head
        while currX != None and currX.data != x:
            prevX = currX
            currX = currX.next
 
        # Search for y (keep track of prevY and currY)
        prevY = None
        currY = self.head
        while currY != None and currY.data != y:
            prevY = currY
            currY = currY.next
 
        # If either x or y is not present, nothing to do
        if currX == None or currY == None:
            return
        # If x is not head of linked list
        if prevX != None:
            prevX.next = currY
        else:  # make y the new head
            self.head = currY
 
        # If y is not head of linked list
        if prevY != None:
            prevY.next = currX
        else:  # make x the new head
            self.head = currX
 
        # Swap next pointers
        temp = currX.next
        currX.next = currY.next
        currY.next = temp
 
    # Function to add Node at beginning of list.
    def push(self, new_data):
 
        # 1. alloc the Node and put the data
        new_Node = self.Node(new_data)
 
        # 2. Make next of new Node as head
        new_Node.next = self.head
 
        # 3. Move the head to point to new Node
        self.head = new_Node
 
    # This function prints contents of linked list starting
    # from the given Node
    def printList(self):
        tNode = self.head
        while tNode != None:
            print tNode.data,
            tNode = tNode.next
 
 
# Driver program to test above function
llist = LinkedList()
 
# The constructed linked list is:
# 1->2->3->4->5->6->7
llist.push(7)
llist.push(6)
llist.push(5)
llist.push(4)
llist.push(3)
llist.push(2)
llist.push(1)
print "Linked list before calling swapNodes() "
llist.printList()
llist.swapNodes(4, 3)
print "\nLinked list after calling swapNodes() "
llist.printList()
 
# This code is contributed by BHAVYA JAIN


C#
// C# program to swap two given
// nodes of a linked list
using System;
 
class Node {
    public int data;
    public Node next;
    public Node(int d)
    {
        data = d;
        next = null;
    }
}
 
public class LinkedList {
    Node head; // head of list
 
    /* Function to swap Nodes x and y in
    linked list by changing links */
    public void swapNodes(int x, int y)
    {
        // Nothing to do if x and y are same
        if (x == y)
            return;
 
        // Search for x (keep track of prevX and CurrX)
        Node prevX = null, currX = head;
        while (currX != null && currX.data != x) {
            prevX = currX;
            currX = currX.next;
        }
 
        // Search for y (keep track of prevY and currY)
        Node prevY = null, currY = head;
        while (currY != null && currY.data != y) {
            prevY = currY;
            currY = currY.next;
        }
 
        // If either x or y is not present, nothing to do
        if (currX == null || currY == null)
            return;
 
        // If x is not head of linked list
        if (prevX != null)
            prevX.next = currY;
        else // make y the new head
            head = currY;
 
        // If y is not head of linked list
        if (prevY != null)
            prevY.next = currX;
        else // make x the new head
            head = currX;
 
        // Swap next pointers
        Node temp = currX.next;
        currX.next = currY.next;
        currY.next = temp;
    }
 
    /* Function to add Node at beginning of 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;
        }
    }
 
    /* Driver code */
    public static void Main(String[] args)
    {
        LinkedList llist = new LinkedList();
 
        /* The constructed linked list is:
            1->2->3->4->5->6->7 */
        llist.push(7);
        llist.push(6);
        llist.push(5);
        llist.push(4);
        llist.push(3);
        llist.push(2);
        llist.push(1);
 
        Console.Write(
            "\n Linked list before calling swapNodes() ");
        llist.printList();
 
        llist.swapNodes(4, 3);
 
        Console.Write(
            "\n Linked list after calling swapNodes() ");
        llist.printList();
    }
}
 
// This code is contributed by 29AjayKumar


Javascript


C++
// C++ program to swap two given nodes of a linked list
#include 
 
using namespace std;
 
// A linked list node class
class Node {
 
public:
    int data;
    class Node* next;
 
    // constructor
    Node(int val, Node* next)
        : data(val)
        , next(next)
    {
    }
 
    // print list from this
    // to last till null
    void printList()
    {
 
        Node* node = this;
 
        while (node != NULL) {
 
            cout << node->data << " ";
            node = node->next;
        }
 
        cout << endl;
    }
};
 
// Function to add a node
// at the beginning of List
void push(Node** head_ref, int new_data)
{
 
    // allocate node
    (*head_ref) = new Node(new_data, *head_ref);
}
 
void swap(Node*& a, Node*& b)
{
 
    Node* temp = a;
    a = b;
    b = temp;
}
 
void swapNodes(Node** head_ref, int x, int y)
{
 
    // Nothing to do if x and y are same
    if (x == y)
        return;
 
    Node **a = NULL, **b = NULL;
 
    // search for x and y in the linked list
    // and store therir pointer in a and b
    while (*head_ref) {
 
        if ((*head_ref)->data == x) {
            a = head_ref;
        }
 
        else if ((*head_ref)->data == y) {
            b = head_ref;
        }
 
        head_ref = &((*head_ref)->next);
    }
 
    // if we have found both a and b
    // in the linked list swap current
    // pointer and next pointer of these
    if (a && b) {
 
        swap(*a, *b);
        swap(((*a)->next), ((*b)->next));
    }
}
 
// Driver code
int main()
{
 
    Node* start = NULL;
 
    // The constructed linked list is:
    // 1->2->3->4->5->6->7
    push(&start, 7);
    push(&start, 6);
    push(&start, 5);
    push(&start, 4);
    push(&start, 3);
    push(&start, 2);
    push(&start, 1);
 
    cout << "Linked list before calling swapNodes() ";
    start->printList();
 
    swapNodes(&start, 6, 1);
 
    cout << "Linked list after calling swapNodes() ";
    start->printList();
}


Java
// Java program to swap two given nodes of a linked list
public class Solution {
 
    // Represent a node of the singly linked list
    class Node {
        int data;
        Node next;
 
        public Node(int data)
        {
            this.data = data;
            this.next = null;
        }
    }
 
    // Represent the head and tail of the singly linked list
    public Node head = null;
    public Node tail = null;
 
    // addNode() will add a new node to the list
    public void addNode(int data)
    {
        // Create a new node
        Node newNode = new Node(data);
 
        // Checks if the list is empty
        if (head == null) {
            // If list is empty, both head and
            // tail will point to new node
            head = newNode;
            tail = newNode;
        }
        else {
            // newNode will be added after tail such that
            // tail's next will point to newNode
            tail.next = newNode;
            // newNode will become new tail of the list
            tail = newNode;
        }
    }
 
    // swap() will swap the given two nodes
    public void swap(int n1, int n2)
    {
        Node prevNode1 = null, prevNode2 = null,
             node1 = head, node2 = head;
 
        // Checks if list is empty
        if (head == null) {
            return;
        }
 
        // If n1 and n2 are equal, then
        // list will remain the same
        if (n1 == n2)
            return;
 
        // Search for node1
        while (node1 != null && node1.data != n1) {
            prevNode1 = node1;
            node1 = node1.next;
        }
 
        // Search for node2
        while (node2 != null && node2.data != n2) {
            prevNode2 = node2;
            node2 = node2.next;
        }
 
        if (node1 != null && node2 != null) {
 
            // If previous node to node1 is not null then,
            // it will point to node2
            if (prevNode1 != null)
                prevNode1.next = node2;
            else
                head = node2;
 
            // If previous node to node2 is not null then,
            // it will point to node1
            if (prevNode2 != null)
                prevNode2.next = node1;
            else
                head = node1;
 
            // Swaps the next nodes of node1 and node2
            Node temp = node1.next;
            node1.next = node2.next;
            node2.next = temp;
        }
        else {
            System.out.println("Swapping is not possible");
        }
    }
 
    // display() will display all the
    // nodes present in the list
    public void display()
    {
        // Node current will point to head
        Node current = head;
 
        if (head == null) {
            System.out.println("List is empty");
            return;
        }
        while (current != null) {
            // Prints each node by incrementing pointer
            System.out.print(current.data + " ");
            current = current.next;
        }
        System.out.println();
    }
 
    public static void main(String[] args)
    {
 
        Solution sList = new Solution();
 
        // Add nodes to the list
        sList.addNode(1);
        sList.addNode(2);
        sList.addNode(3);
        sList.addNode(4);
        sList.addNode(5);
        sList.addNode(6);
        sList.addNode(7);
 
        System.out.println("Original list: ");
        sList.display();
 
        // Swaps the node 2 with node 5
        sList.swap(6, 1);
 
        System.out.println("List after swapping nodes: ");
        sList.display();
    }
}


Python3
# Python3 program to swap two given
# nodes of a linked list
 
# A linked list node class
 
 
class Node:
 
    # constructor
    def __init__(self, val=None, next1=None):
        self.data = val
        self.next = next1
 
    # print list from this
    # to last till None
    def printList(self):
 
        node = self
 
        while (node != None):
            print(node.data, end=" ")
            node = node.next
        print(" ")
 
# Function to add a node
# at the beginning of List
 
 
def push(head_ref, new_data):
 
    # allocate node
    (head_ref) = Node(new_data, head_ref)
    return head_ref
 
 
def swapNodes(head_ref, x, y):
    head = head_ref
 
    # Nothing to do if x and y are same
    if (x == y):
        return None
 
    a = None
    b = None
 
    # search for x and y in the linked list
    # and store therir pointer in a and b
    while (head_ref.next != None):
 
        if ((head_ref.next).data == x):
            a = head_ref
 
        elif ((head_ref.next).data == y):
            b = head_ref
 
        head_ref = ((head_ref).next)
 
    # if we have found both a and b
    # in the linked list swap current
    # pointer and next pointer of these
    if (a != None and b != None):
        temp = a.next
        a.next = b.next
        b.next = temp
        temp = a.next.next
        a.next.next = b.next.next
        b.next.next = temp
 
    return head
 
# Driver code
 
 
start = None
 
# The constructed linked list is:
# 1.2.3.4.5.6.7
start = push(start, 7)
start = push(start, 6)
start = push(start, 5)
start = push(start, 4)
start = push(start, 3)
start = push(start, 2)
start = push(start, 1)
 
print("Linked list before calling swapNodes() ")
start.printList()
 
start = swapNodes(start, 6, 1)
 
print("Linked list after calling swapNodes() ")
start.printList()
 
# This code is contributed by Arnab Kundu


C#
// C# program to swap two
// given nodes of a linked list
using System;
 
class GFG {
    // A linked list node class
    public class Node {
 
        public int data;
        public Node next;
 
        // constructor
        public Node(int val, Node next1)
        {
            data = val;
            next = next1;
        }
 
        // print list from this
        // to last till null
        public void printList()
        {
 
            Node node = this;
 
            while (node != null) {
                Console.Write(node.data + " ");
                node = node.next;
            }
            Console.WriteLine();
        }
    }
 
    // Function to add a node
    // at the beginning of List
    static Node push(Node head_ref, int new_data)
    {
 
        // allocate node
        (head_ref) = new Node(new_data, head_ref);
        return head_ref;
    }
 
    static Node swapNodes(Node head_ref, int x, int y)
    {
        Node head = head_ref;
 
        // Nothing to do if x and y are same
        if (x == y)
            return null;
 
        Node a = null, b = null;
 
        // search for x and y in the linked list
        // and store therir pointer in a and b
        while (head_ref.next != null) {
 
            if ((head_ref.next).data == x) {
                a = head_ref;
            }
 
            else if ((head_ref.next).data == y) {
                b = head_ref;
            }
 
            head_ref = ((head_ref).next);
        }
 
        // if we have found both a and b
        // in the linked list swap current
        // pointer and next pointer of these
        if (a != null && b != null) {
            Node temp = a.next;
            a.next = b.next;
            b.next = temp;
            temp = a.next.next;
            a.next.next = b.next.next;
            b.next.next = temp;
        }
        return head;
    }
 
    // Driver code
    public static void Main()
    {
 
        Node start = null;
 
        // The constructed linked list is:
        // 1.2.3.4.5.6.7
        start = push(start, 7);
        start = push(start, 6);
        start = push(start, 5);
        start = push(start, 4);
        start = push(start, 3);
        start = push(start, 2);
        start = push(start, 1);
 
        Console.Write(
            "Linked list before calling swapNodes() ");
        start.printList();
 
        start = swapNodes(start, 6, 1);
 
        Console.Write(
            "Linked list after calling swapNodes() ");
        start.printList();
    }
}
 
/* This code contributed by PrinciRaj1992 */


Javascript


输出
Linked list before calling swapNodes() 1 2 3 4 5 6 7 
Linked list after calling swapNodes() 1 2 4 3 5 6 7 

优化:可以优化上面的代码以在单次遍历中搜索 x 和 y。两个循环用于保持程序简单。

更简单的方法——

C++

// C++ program to swap two given nodes of a linked list
#include 
 
using namespace std;
 
// A linked list node class
class Node {
 
public:
    int data;
    class Node* next;
 
    // constructor
    Node(int val, Node* next)
        : data(val)
        , next(next)
    {
    }
 
    // print list from this
    // to last till null
    void printList()
    {
 
        Node* node = this;
 
        while (node != NULL) {
 
            cout << node->data << " ";
            node = node->next;
        }
 
        cout << endl;
    }
};
 
// Function to add a node
// at the beginning of List
void push(Node** head_ref, int new_data)
{
 
    // allocate node
    (*head_ref) = new Node(new_data, *head_ref);
}
 
void swap(Node*& a, Node*& b)
{
 
    Node* temp = a;
    a = b;
    b = temp;
}
 
void swapNodes(Node** head_ref, int x, int y)
{
 
    // Nothing to do if x and y are same
    if (x == y)
        return;
 
    Node **a = NULL, **b = NULL;
 
    // search for x and y in the linked list
    // and store therir pointer in a and b
    while (*head_ref) {
 
        if ((*head_ref)->data == x) {
            a = head_ref;
        }
 
        else if ((*head_ref)->data == y) {
            b = head_ref;
        }
 
        head_ref = &((*head_ref)->next);
    }
 
    // if we have found both a and b
    // in the linked list swap current
    // pointer and next pointer of these
    if (a && b) {
 
        swap(*a, *b);
        swap(((*a)->next), ((*b)->next));
    }
}
 
// Driver code
int main()
{
 
    Node* start = NULL;
 
    // The constructed linked list is:
    // 1->2->3->4->5->6->7
    push(&start, 7);
    push(&start, 6);
    push(&start, 5);
    push(&start, 4);
    push(&start, 3);
    push(&start, 2);
    push(&start, 1);
 
    cout << "Linked list before calling swapNodes() ";
    start->printList();
 
    swapNodes(&start, 6, 1);
 
    cout << "Linked list after calling swapNodes() ";
    start->printList();
}

Java

// Java program to swap two given nodes of a linked list
public class Solution {
 
    // Represent a node of the singly linked list
    class Node {
        int data;
        Node next;
 
        public Node(int data)
        {
            this.data = data;
            this.next = null;
        }
    }
 
    // Represent the head and tail of the singly linked list
    public Node head = null;
    public Node tail = null;
 
    // addNode() will add a new node to the list
    public void addNode(int data)
    {
        // Create a new node
        Node newNode = new Node(data);
 
        // Checks if the list is empty
        if (head == null) {
            // If list is empty, both head and
            // tail will point to new node
            head = newNode;
            tail = newNode;
        }
        else {
            // newNode will be added after tail such that
            // tail's next will point to newNode
            tail.next = newNode;
            // newNode will become new tail of the list
            tail = newNode;
        }
    }
 
    // swap() will swap the given two nodes
    public void swap(int n1, int n2)
    {
        Node prevNode1 = null, prevNode2 = null,
             node1 = head, node2 = head;
 
        // Checks if list is empty
        if (head == null) {
            return;
        }
 
        // If n1 and n2 are equal, then
        // list will remain the same
        if (n1 == n2)
            return;
 
        // Search for node1
        while (node1 != null && node1.data != n1) {
            prevNode1 = node1;
            node1 = node1.next;
        }
 
        // Search for node2
        while (node2 != null && node2.data != n2) {
            prevNode2 = node2;
            node2 = node2.next;
        }
 
        if (node1 != null && node2 != null) {
 
            // If previous node to node1 is not null then,
            // it will point to node2
            if (prevNode1 != null)
                prevNode1.next = node2;
            else
                head = node2;
 
            // If previous node to node2 is not null then,
            // it will point to node1
            if (prevNode2 != null)
                prevNode2.next = node1;
            else
                head = node1;
 
            // Swaps the next nodes of node1 and node2
            Node temp = node1.next;
            node1.next = node2.next;
            node2.next = temp;
        }
        else {
            System.out.println("Swapping is not possible");
        }
    }
 
    // display() will display all the
    // nodes present in the list
    public void display()
    {
        // Node current will point to head
        Node current = head;
 
        if (head == null) {
            System.out.println("List is empty");
            return;
        }
        while (current != null) {
            // Prints each node by incrementing pointer
            System.out.print(current.data + " ");
            current = current.next;
        }
        System.out.println();
    }
 
    public static void main(String[] args)
    {
 
        Solution sList = new Solution();
 
        // Add nodes to the list
        sList.addNode(1);
        sList.addNode(2);
        sList.addNode(3);
        sList.addNode(4);
        sList.addNode(5);
        sList.addNode(6);
        sList.addNode(7);
 
        System.out.println("Original list: ");
        sList.display();
 
        // Swaps the node 2 with node 5
        sList.swap(6, 1);
 
        System.out.println("List after swapping nodes: ");
        sList.display();
    }
}

蟒蛇3

# Python3 program to swap two given
# nodes of a linked list
 
# A linked list node class
 
 
class Node:
 
    # constructor
    def __init__(self, val=None, next1=None):
        self.data = val
        self.next = next1
 
    # print list from this
    # to last till None
    def printList(self):
 
        node = self
 
        while (node != None):
            print(node.data, end=" ")
            node = node.next
        print(" ")
 
# Function to add a node
# at the beginning of List
 
 
def push(head_ref, new_data):
 
    # allocate node
    (head_ref) = Node(new_data, head_ref)
    return head_ref
 
 
def swapNodes(head_ref, x, y):
    head = head_ref
 
    # Nothing to do if x and y are same
    if (x == y):
        return None
 
    a = None
    b = None
 
    # search for x and y in the linked list
    # and store therir pointer in a and b
    while (head_ref.next != None):
 
        if ((head_ref.next).data == x):
            a = head_ref
 
        elif ((head_ref.next).data == y):
            b = head_ref
 
        head_ref = ((head_ref).next)
 
    # if we have found both a and b
    # in the linked list swap current
    # pointer and next pointer of these
    if (a != None and b != None):
        temp = a.next
        a.next = b.next
        b.next = temp
        temp = a.next.next
        a.next.next = b.next.next
        b.next.next = temp
 
    return head
 
# Driver code
 
 
start = None
 
# The constructed linked list is:
# 1.2.3.4.5.6.7
start = push(start, 7)
start = push(start, 6)
start = push(start, 5)
start = push(start, 4)
start = push(start, 3)
start = push(start, 2)
start = push(start, 1)
 
print("Linked list before calling swapNodes() ")
start.printList()
 
start = swapNodes(start, 6, 1)
 
print("Linked list after calling swapNodes() ")
start.printList()
 
# This code is contributed by Arnab Kundu

C#

// C# program to swap two
// given nodes of a linked list
using System;
 
class GFG {
    // A linked list node class
    public class Node {
 
        public int data;
        public Node next;
 
        // constructor
        public Node(int val, Node next1)
        {
            data = val;
            next = next1;
        }
 
        // print list from this
        // to last till null
        public void printList()
        {
 
            Node node = this;
 
            while (node != null) {
                Console.Write(node.data + " ");
                node = node.next;
            }
            Console.WriteLine();
        }
    }
 
    // Function to add a node
    // at the beginning of List
    static Node push(Node head_ref, int new_data)
    {
 
        // allocate node
        (head_ref) = new Node(new_data, head_ref);
        return head_ref;
    }
 
    static Node swapNodes(Node head_ref, int x, int y)
    {
        Node head = head_ref;
 
        // Nothing to do if x and y are same
        if (x == y)
            return null;
 
        Node a = null, b = null;
 
        // search for x and y in the linked list
        // and store therir pointer in a and b
        while (head_ref.next != null) {
 
            if ((head_ref.next).data == x) {
                a = head_ref;
            }
 
            else if ((head_ref.next).data == y) {
                b = head_ref;
            }
 
            head_ref = ((head_ref).next);
        }
 
        // if we have found both a and b
        // in the linked list swap current
        // pointer and next pointer of these
        if (a != null && b != null) {
            Node temp = a.next;
            a.next = b.next;
            b.next = temp;
            temp = a.next.next;
            a.next.next = b.next.next;
            b.next.next = temp;
        }
        return head;
    }
 
    // Driver code
    public static void Main()
    {
 
        Node start = null;
 
        // The constructed linked list is:
        // 1.2.3.4.5.6.7
        start = push(start, 7);
        start = push(start, 6);
        start = push(start, 5);
        start = push(start, 4);
        start = push(start, 3);
        start = push(start, 2);
        start = push(start, 1);
 
        Console.Write(
            "Linked list before calling swapNodes() ");
        start.printList();
 
        start = swapNodes(start, 6, 1);
 
        Console.Write(
            "Linked list after calling swapNodes() ");
        start.printList();
    }
}
 
/* This code contributed by PrinciRaj1992 */

Javascript


输出
Linked list before calling swapNodes() 1 2 3 4 5 6 7 
Linked list after calling swapNodes() 6 2 3 4 5 1 7 

https://www.youtube.com/watch?v=V4ZHvhvVmSE

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程