📜  用数组的元素替换双向链表的偶数节点

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

用数组的元素替换双向链表的偶数节点

给定一个双向链表和一个只有奇数值的数组。两者的大小 N 相同。任务是用数组元素从左到右替换所有具有偶数值的节点。

例子:

方法:思路是逐个遍历双向链表的节点,得到偶数数据节点的指针,然后用数组的值替换,并增加数组的索引,移动到下一个节点链表。
以下是上述方法的实现:

C++
// C++ implementation to create
// odd doubly linked list
#include 
using namespace std;
 
// Node of the doubly linked list
struct Node {
    int data;
    Node *prev, *next;
};
 
// function to insert a node at the beginning
// of the Doubly Linked List
void push(Node** head_ref, int new_data)
{
    // allocate node
    Node* new_node = (Node*)malloc(sizeof(struct Node));
 
    // put in the data
    new_node->data = new_data;
 
    // since we are adding at the beginning,
    // prev is always NULL
    new_node->prev = NULL;
 
    // link the old list off the new node
    new_node->next = (*head_ref);
 
    // change prev of head node to new node
    if ((*head_ref) != NULL)
        (*head_ref)->prev = new_node;
 
    // move the head to point to the new node
    (*head_ref) = new_node;
}
 
// function to make all node is odd
void makeOddNode(Node** head_ref, int A[], int n)
{
    Node* ptr = *head_ref;
    Node* next;
    int i = 0;
    // traves list till last node
    while (ptr != NULL) {
        next = ptr->next;
        // check if node is even then
        // replace it and increment in i
        if (ptr->data % 2 == 0) {
            ptr->data = A[i];
            i++;
        }
        ptr = next;
    }
    // return sum of nodes which is divided by K
}
// function to print nodes in a
// given doubly linked list
void printList(Node* head)
{
    while (head != NULL) {
        cout << head->data << " ";
        head = head->next;
    }
}
 
// Driver program to test above
int main()
{
    // start with the empty list
    Node* head = NULL;
 
    // create the doubly linked list
    // 6 <=> 9 <=> 8 <=> 7 <=> 4
    int Arr[] = { 3, 5, 23, 17, 1 };
    push(&head, 4);
    push(&head, 7);
    push(&head, 8);
    push(&head, 9);
    push(&head, 6);
    int n = sizeof(Arr) / sizeof(Arr[0]);
    cout << "Original List: ";
    printList(head);
    cout << endl;
    makeOddNode(&head, Arr, n);
    cout << "New odd List: ";
    printList(head);
}


Java
// Java implementation to create
// odd doubly linked list
class GFG
{
 
// Node of the doubly linked list
static class Node
{
    int data;
    Node prev, next;
};
 
// function to insert a node at the beginning
// of the Doubly Linked List
static Node push(Node head_ref, int new_data)
{
    // allocate node
    Node new_node = new Node();
 
    // put in the data
    new_node.data = new_data;
 
    // since we are adding at the beginning,
    // prev is always null
    new_node.prev = null;
 
    // link the old list off the new node
    new_node.next = (head_ref);
 
    // change prev of head node to new node
    if ((head_ref) != null)
        (head_ref).prev = new_node;
 
    // move the head to point to the new node
    (head_ref) = new_node;
    return head_ref;
}
 
// function to make all node is odd
static Node makeOddNode(Node head_ref, int A[], int n)
{
    Node ptr = head_ref;
    Node next;
    int i = 0;
    // traves list till last node
    while (ptr != null)
    {
        next = ptr.next;
         
        // check if node is even then
        // replace it and increment in i
        if (ptr.data % 2 == 0)
        {
 
            ptr.data = A[i];
            i++;
        }
        ptr = next;
    }
     
    // return sum of nodes which is divided by K
    return head_ref;
}
 
// function to print nodes in a
// given doubly linked list
static void printList(Node head)
{
    while (head != null)
    {
        System.out.print( head.data + " ");
        head = head.next;
    }
}
 
// Driver code
public static void main(String args[])
{
    // start with the empty list
    Node head = null;
 
    // create the doubly linked list
    // 6 <=> 9 <=> 8 <=> 7 <=> 4
    int Arr[] = { 3, 5, 23, 17, 1 };
    head = push(head, 4);
    head = push(head, 7);
    head = push(head, 8);
    head = push(head, 9);
    head = push(head, 6);
    int n = Arr.length;
    System.out.print( "Original List: ");
    printList(head);
    System.out.println();
    head = makeOddNode(head, Arr, n);
    System.out.print("New odd List: ");
    printList(head);
}
}
 
// This code is contributed by Arnab Kundu


Python3
# Python3 implementation to
# create odd doubly linked list
 
# Node of the doubly linked list
class Node:
     
    def __init__(self, data):
        self.data = data
        self.prev = None
        self.next = None
 
# Function to insert a node at the
# beginning of the Doubly Linked List
def push(head_ref, new_data):
 
    # allocate node
    new_node = Node(new_data)
 
    # link the old list off the new node
    new_node.next = head_ref
 
    # change prev of head node to new node
    if head_ref != None:
        head_ref.prev = new_node
 
    # move the head to point to the new node
    head_ref = new_node
    return head_ref
 
# Function to make all node is odd
def makeOddNode(head_ref, A, n):
 
    ptr = head_ref
    i = 0
     
    # traves list till last node
    while ptr != None:
         
        next = ptr.next
         
        # check if node is even then
        # replace it and increment in i
        if ptr.data % 2 == 0:
            ptr.data = A[i]
            i += 1
         
        ptr = next
     
    # return sum of nodes which is divided by K
 
# Function to print nodes in a
# given doubly linked list
def printList(head):
 
    while head != None:
        print(head.data, end = " ")
        head = head.next
 
# Driver Code
if __name__ == "__main__":
 
    # start with the empty list
    head = None
 
    # create the doubly linked list
    # 6 <=> 9 <=> 8 <=> 7 <=> 4
    Arr = [3, 5, 23, 17, 1]
    head = push(head, 4)
    head = push(head, 7)
    head = push(head, 8)
    head = push(head, 9)
    head = push(head, 6)
    n = len(Arr)
     
    print("Original List:", end = " ")
    printList(head)
    print()
     
    makeOddNode(head, Arr, n)
    print("New odd List:", end = " ")
    printList(head)
 
# This code is contributed by Rituraj Jain


C#
// C# implementation to create
// odd doubly linked list
using System;
     
class GFG
{
 
// Node of the doubly linked list
public class Node
{
    public int data;
    public Node prev, next;
};
 
// function to insert a node at the beginning
// of the Doubly Linked List
static Node push(Node head_ref, int new_data)
{
    // allocate node
    Node new_node = new Node();
 
    // put in the data
    new_node.data = new_data;
 
    // since we are adding at the beginning,
    // prev is always null
    new_node.prev = null;
 
    // link the old list off the new node
    new_node.next = (head_ref);
 
    // change prev of head node to new node
    if ((head_ref) != null)
        (head_ref).prev = new_node;
 
    // move the head to point to the new node
    (head_ref) = new_node;
    return head_ref;
}
 
// function to make all node is odd
static Node makeOddNode(Node head_ref, int []A, int n)
{
    Node ptr = head_ref;
    Node next;
    int i = 0;
     
    // traves list till last node
    while (ptr != null)
    {
        next = ptr.next;
         
        // check if node is even then
        // replace it and increment in i
        if (ptr.data % 2 == 0)
        {
 
            ptr.data = A[i];
            i++;
        }
        ptr = next;
    }
     
    // return sum of nodes which is divided by K
    return head_ref;
}
 
// function to print nodes in a
// given doubly linked list
static void printList(Node head)
{
    while (head != null)
    {
        Console.Write( head.data + " ");
        head = head.next;
    }
}
 
// Driver code
public static void Main(String []args)
{
    // start with the empty list
    Node head = null;
 
    // create the doubly linked list
    // 6 <=> 9 <=> 8 <=> 7 <=> 4
    int []Arr = { 3, 5, 23, 17, 1 };
    head = push(head, 4);
    head = push(head, 7);
    head = push(head, 8);
    head = push(head, 9);
    head = push(head, 6);
    int n = Arr.Length;
    Console.WriteLine( "Original List: ");
    printList(head);
    Console.WriteLine();
    head = makeOddNode(head, Arr, n);
    Console.WriteLine("New odd List: ");
    printList(head);
}
}
 
// This code contributed by Rajput-Ji


Javascript


输出:
Original List: 6 9 8 7 4 
New odd List: 3 9 5 7 23

时间复杂度:O(N),其中 N 是节点的总数。