📜  在链表的特定位置插入节点

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

在链表的特定位置插入节点

给定一个单向链表、一个位置和一个元素,任务是编写一个程序,将该元素插入链表中的给定位置。

例子:

Input: 3->5->8->10, data = 2, position = 2
Output: 3->2->5->8->10

Input: 3->5->8->10, data = 11, position = 5
Output: 3->5->8->10->11 

方法:要在指定位置插入给定数据,应遵循以下算法:

  • 遍历链表直到位置 1节点。
  • 遍历所有位置 1节点后,将内存和给定数据分配给新节点。
  • 将新节点的下一个指针指向当前节点的下一个。
  • 将当前节点的下一个指针指向新节点。

下面是上述算法的实现。

C++
// C++ program for insertion in a single linked
// list at a specified position
#include 
using namespace std;
 
// A linked list Node
struct Node {
    int data;
    struct Node* next;
};
 
// Size of linked list
int size = 0;
 
// function to create and return a Node
Node* getNode(int data)
{
    // allocating space
    Node* newNode = new Node();
 
    // inserting the required data
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}
 
// function to insert a Node at required position
void insertPos(Node** current, int pos, int data)
{
    // This condition to check whether the
    // position given is valid or not.
    if (pos < 1 || pos > size + 1)
        cout << "Invalid position!" << endl;
    else {
 
        // Keep looping until the pos is zero
        while (pos--) {
 
            if (pos == 0) {
 
                // adding Node at required position
                Node* temp = getNode(data);
 
                // Making the new Node to point to
                // the old Node at the same position
                temp->next = *current;
 
                // Changing the pointer of the Node previous
                // to the old Node to point to the new Node
                *current = temp;
            }
            else
              // Assign double pointer variable to point to the
              // pointer pointing to the address of next Node
              current = &(*current)->next;
        }
        size++;
    }
}
 
// This function prints contents
// of the linked list
void printList(struct Node* head)
{
    while (head != NULL) {
        cout << " " << head->data;
        head = head->next;
    }
    cout << endl;
}
 
// Driver Code
int main()
{
    // Creating the list 3->5->8->10
    Node* head = NULL;
    head = getNode(3);
    head->next = getNode(5);
    head->next->next = getNode(8);
    head->next->next->next = getNode(10);
 
    size = 4;
 
    cout << "Linked list before insertion: ";
    printList(head);
 
    int data = 12, pos = 3;
    insertPos(&head, pos, data);
    cout << "Linked list after insertion of 12 at position 3: ";
    printList(head);
 
    // front of the linked list
    data = 1, pos = 1;
    insertPos(&head, pos, data);
    cout << "Linked list after insertion of 1 at position 1: ";
    printList(head);
 
    // insertion at end of the linked list
    data = 15, pos = 7;
    insertPos(&head, pos, data);
    cout << "Linked list after insertion of 15 at position 7: ";
    printList(head);
 
    return 0;
}


Java
// Java program for insertion in a single linked
// list at a specified position
 
class GFG {
    // A linked list Node
    static class Node {
        public int data;
        public Node nextNode;
 
        // inserting the required data
        public Node(int data) {
            this.data = data;
 
        }
    }
 
    // function to create and return a Node
    static Node GetNode(int data) {
        return new Node(data);
    }
 
    // function to insert a Node at required position
    static Node InsertPos(Node headNode, int position, int data) {
        Node head = headNode;
        if (position < 1)
            System.out.print("Invalid position");
 
        // if position is 1 then new node is
        // set infornt of head node
        // head node is changing.
        if (position == 1) {
            Node newNode = new Node(data);
            newNode.nextNode = headNode;
            head = newNode;
        } else {
            while (position-- != 0) {
                if (position == 1) {
                    // adding Node at required position
                    Node newNode = GetNode(data);
 
                    // Making the new Node to point to
                    // the old Node at the same position
                    newNode.nextNode = headNode.nextNode;
 
                    // Replacing current with new Node
                    // to the old Node to point to the new Node
                    headNode.nextNode = newNode;
                    break;
                }
                headNode = headNode.nextNode;
            }
            if (position != 1)
                System.out.print("Position out of range");
        }
        return head;
    }
 
    static void PrintList(Node node) {
        while (node != null) {
            System.out.print(node.data);
            node = node.nextNode;
            if (node != null)
                System.out.print(",");
        }
        System.out.println();
    }
 
    // Driver code
    public static void main(String[] args) {
        Node head = GetNode(3);
        head.nextNode = GetNode(5);
        head.nextNode.nextNode = GetNode(8);
        head.nextNode.nextNode.nextNode = GetNode(10);
 
        System.out.print("Linked list before insertion: ");
        PrintList(head);
 
        int data = 12, pos = 3;
        head = InsertPos(head, pos, data);
        System.out.print("Linked list after" + " insertion of 12 at position 3: ");
        PrintList(head);
 
        // front of the linked list
        data = 1;
        pos = 1;
        head = InsertPos(head, pos, data);
        System.out.print("Linked list after" + "insertion of 1 at position 1: ");
        PrintList(head);
 
        // insertion at end of the linked list
        data = 15;
        pos = 7;
        head = InsertPos(head, pos, data);
        System.out.print("Linked list after" + " insertion of 15 at position 7: ");
        PrintList(head);
    }
}
 
// This code is contributed by Rajput-Ji


Python3
# Python3 program for insertion in a single linked
# list at a specified position
  
# A linked list Node
class Node: 
    def __init__(self, data):   
        self.data = data
        self.nextNode = None
  
# function to create and return a Node
def getNode(data):
 
    # allocating space
    newNode = Node(data)
    return newNode;
 
# function to insert a Node at required position
def insertPos(headNode, position, data):
    head = headNode
     
    # This condition to check whether the
    # position given is valid or not.
    if (position < 1):       
        print("Invalid position!")
     
    if position == 1:
        newNode = Node(data)
        newNode.nextNode = headNode
        head = newNode
             
    else:
       
        # Keep looping until the position is zero
        while (position != 0):          
            position -= 1
  
            if (position == 1):
  
               # adding Node at required position
               newNode = getNode(data)
 
               # Making the new Node to point to
               # the old Node at the same position
               newNode.nextNode = headNode.nextNode
 
               # Replacing headNode with new Node
               # to the old Node to point to the new Node
               headNode.nextNode = newNode
               break
             
            headNode = headNode.nextNode
            if headNode == None:
                break           
        if position != 1:
              print("position out of range")       
    return head
      
# This function prints contents
# of the linked list
def printList(head):
    while (head != None):      
        print(' ' + str(head.data), end = '')
        head = head.nextNode;   
    print()
      
# Driver Code
if __name__=='__main__':
     
    # Creating the list 3.5.8.10
    head = getNode(3);
    head.nextNode = getNode(5);
    head.nextNode.nextNode = getNode(8);
    head.nextNode.nextNode.nextNode = getNode(10);
    print("Linked list before insertion: ", end='')
    printList(head);
    data = 12
    position = 3;
    head = insertPos(head, position, data);
    print("Linked list after insertion of 12 at position 3: ", end = '')
    printList(head);
  
    # front of the linked list
    data = 1
    position = 1;
    head = insertPos(head, position, data);
    print("Linked list after insertion of 1 at position 1: ", end = '')
    printList(head);
  
    # insertion at end of the linked list
    data = 15
    position = 7;
    head = insertPos(head, position, data);
    print("Linked list after insertion of 15 at position 7: ", end='')
    printList(head);
 
# This code iscontributed by rutvik_56


C#
// C# program for insertion in a single linked
// list at a specified position
using System;
 
namespace InsertIntoLinkedList
{
    class Program
    {
        // A linked list Node
        private class Node
        {
            public int data;
            public Node nextNode;
 
            // inserting the required data
            public Node(int data) => this.data = data;
        }
 
        // function to create and return a Node
        static Node GetNode(int data) => new Node(data);
 
        // function to insert a Node at required position
        static Node InsertPos(Node headNode,
                            int position, int data)
        {
            var head = headNode;
            if (position < 1)
                Console.WriteLine("Invalid position");
 
            //if position is 1 then new node is
            // set infornt of head node
            //head node is changing.
            if (position == 1)
            {
                var newNode = new Node(data);
                newNode.nextNode = headNode;
                head = newNode;
            }
            else
            {
                while (position-- != 0)
                {
                    if (position == 1)
                    {
                        // adding Node at required position
                        Node newNode = GetNode(data);
 
                        // Making the new Node to point to
                        // the old Node at the same position
                        newNode.nextNode = headNode.nextNode;
 
                        // Replacing current with new Node
                        // to the old Node to point to the new Node
                        headNode.nextNode = newNode;
                        break;
                    }
                    headNode = headNode.nextNode;
                }
                if (position != 1)
                    Console.WriteLine("Position out of range");
            }
            return head;
        }
 
        static void PrintList(Node node)
        {
            while (node != null)
            {
                Console.Write(node.data);
                node = node.nextNode;
                if(node != null)
                    Console.Write(",");
            }
            Console.WriteLine();
        }
 
        // Driver code
        static void Main(string[] args)
        {
            var head = GetNode(3);
            head.nextNode = GetNode(5);
            head.nextNode.nextNode = GetNode(8);
            head.nextNode.nextNode.nextNode = GetNode(10);
 
            Console.WriteLine("Linked list before insertion: ");
            PrintList(head);
 
            int data = 12, pos = 3;
            head = InsertPos(head, pos, data);
            Console.WriteLine("Linked list after" +
                            " insertion of 12 at position 3: ");
            PrintList(head);
 
            // front of the linked list
            data = 1; pos = 1;
            head = InsertPos(head, pos, data);
            Console.WriteLine("Linked list after" +
                            "insertion of 1 at position 1: ");
            PrintList(head);
 
            // insertion at end of the linked list
            data = 15; pos = 7;
            head = InsertPos(head, pos, data);
            Console.WriteLine("Linked list after" +
                            " insertion of 15 at position 7: ");
            PrintList(head);
        }
    }
}
 
// This code is contributed by dhirucoool


Javascript


时间复杂度: O(N)



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