📜  如果当前节点在单向链表中为零,则更新相邻节点

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

如果当前节点在单向链表中为零,则更新相邻节点

给定一个链表。任务是如果当前节点为0,则将节点的上一个和下一个节点的值更改为0。
例子:

Input :  2->3->4->5->0->9->0->9->NULL
Output : 2->3->4->0->0->0->0->0->NULL

Input : 0->2->3->4->0->0->NULL
Output : 0->0->3->0->0->0->NULL

算法

  1. 第一步是创建两个指针prevcurr
    prev将指向前一个节点,curr将指向当前节点。使用prev的原因是我们不能在单链表中回溯。
  2. 如果第一个节点为0,则检查下一个节点是否为0
    • 如果是,跳过
    • 否则将下一个节点更改为-1
  3. 开始遍历列表的节点。
    • 如果当前节点为0且变量temp0
      • 将上一个节点设置为-1
      • 将临时变量设置为1
    • 如果临时值为1且当前节点数据不是1,则将当前节点设置为-1
  4. 重复步骤 3,直到到达列表末尾。
  5. 遍历列表并将值为-1的节点更改为0

使用temp-1 的原因是,如果我们直接将下一个节点更改为0 ,那么这可能会导致将下一个节点之后的节点更改为0 ,结果整个列表可能会更改为0
下面是上述方法的实现:

C++
// C++ program to update the adjacent
// nodes in a linked list
 
#include 
using namespace std;
 
// A linked list node
struct Node {
    int data;
    struct Node* next;
};
 
// Utility function to create a new Node
Node* newNode(int data)
{
    Node* temp = new Node;
    temp->data = data;
    temp->next = NULL;
 
    return temp;
}
 
// Function to display the linked list
void printList(Node* node)
{
    // iterate until end of the list is reached
    while (node != NULL) {
        cout << node->data << " ";
 
        node = node->next;
    }
}
 
// Function to update the adjacent
// nodes to zero
void updateAdjacent(Node* head)
{
    // Pointer to point to
    // the previous node
    Node* prev = head;
 
    // Pointer to the
    // current node
    Node* curr = head->next;
 
    // If the first node is zero and the
    // second node is not zero then change
    // the value to -1
    if (prev->data == 0 && curr->data != 0)
        curr->data = -1;
 
    // Temp variable to denote if the
    // current node is zero then the next
    // node will be changed to zero
    int temp = 0;
 
    while (curr != NULL) {
 
        // if the temp variable is 1 and
        // current data is not zero
        if (temp == 1 && curr->data != 0) {
 
            // change the data to -1
            curr->data = -1;
            temp = 0;
        }
 
        // if the data is zero
        if (curr->data == 0) {
 
            // set the temp variable to 1
            temp = 1;
 
            // set the previous node data to -1
            prev->data = -1;
        }
 
        curr = curr->next;
        prev = prev->next;
    }
 
    curr = head;
 
    // change all the nodes with -1 to 0
    while (curr != NULL) {
        if (curr->data == -1)
            curr->data = 0;
 
        curr = curr->next;
    }
}
 
// Driver code
int main()
{
    // creating the linked list
    Node* head = newNode(2);
    head->next = newNode(3);
    head->next->next = newNode(4);
    head->next->next->next = newNode(5);
    head->next->next->next->next = newNode(0);
    head->next->next->next->next->next = newNode(9);
    head->next->next->next->next->next->next = newNode(0);
    head->next->next->next->next->next->next->next = newNode(9);
 
    updateAdjacent(head);
 
    printList(head);
 
    return 0;
}


Java
// Java program to update the adjacent
// nodes in a linked list
class GFG
{
 
// A linked list node
static class Node
{
    int data;
    Node next;
}
 
// Utility function to create a new Node
static Node newNode(int data)
{
    Node temp = new Node();
    temp.data = data;
    temp.next = null;
 
    return temp;
}
 
// Function to display the linked list
static void printList(Node node)
{
    // iterate until end of the list is reached
    while (node != null)
    {
        System.out.print(node.data + " ");
 
        node = node.next;
    }
}
 
// Function to update the adjacent
// nodes to zero
static void updateAdjacent(Node head)
{
    // Pointer to point to
    // the previous node
    Node prev = head;
 
    // Pointer to the
    // current node
    Node curr = head.next;
 
    // If the first node is zero and the
    // second node is not zero then change
    // the value to -1
    if (prev.data == 0 && curr.data != 0)
        curr.data = -1;
 
    // Temp variable to denote if the
    // current node is zero then the next
    // node will be changed to zero
    int temp = 0;
 
    while (curr != null)
    {
 
        // if the temp variable is 1 and
        // current data is not zero
        if (temp == 1 && curr.data != 0)
        {
 
            // change the data to -1
            curr.data = -1;
            temp = 0;
        }
 
        // if the data is zero
        if (curr.data == 0)
        {
 
            // set the temp variable to 1
            temp = 1;
 
            // set the previous node data to -1
            prev.data = -1;
        }
 
        curr = curr.next;
        prev = prev.next;
    }
 
    curr = head;
 
    // change all the nodes with -1 to 0
    while (curr != null)
    {
        if (curr.data == -1)
            curr.data = 0;
 
        curr = curr.next;
    }
}
 
// Driver code
public static void main(String[] args)
{
    // creating the linked list
    Node head = newNode(2);
    head.next = newNode(3);
    head.next.next = newNode(4);
    head.next.next.next = newNode(5);
    head.next.next.next.next = newNode(0);
    head.next.next.next.next.next = newNode(9);
    head.next.next.next.next.next.next = newNode(0);
    head.next.next.next.next.next.next.next = newNode(9);
 
    updateAdjacent(head);
 
    printList(head);
}
}
 
/* This code contributed by PrinciRaj1992 */


Python3
# Python3 program to update the adjacent
# nodes in a linked list
 
# A linked list node
class Node:
     
    def __init__(self, data):
        self.data = data
        self.next = None
 
# Function to display the linked list
def printList(node):
 
    # iterate until end of the
    # list is reached
    while node != None:
        print(node.data, end = " ")
 
        node = node.next
 
# Function to update the adjacent
# nodes to zero
def updateAdjacent(head):
 
    # Pointer to point to
    # the previous node
    prev = head
 
    # Pointer to the
    # current node
    curr = head.next
 
    # If the first node is zero and the
    # second node is not zero then change
    # the value to -1
    if prev.data == 0 and curr.data != 0:
        curr.data = -1
 
    # Temp variable to denote if the
    # current node is zero then the next
    # node will be changed to zero
    temp = 0
 
    while curr != None:
 
        # if the temp variable is 1 and
        # current data is not zero
        if temp == 1 and curr.data != 0:
 
            # change the data to -1
            curr.data = -1
            temp = 0
 
        # if the data is zero
        if curr.data == 0:
 
            # set the temp variable to 1
            temp = 1
 
            # set the previous node data to -1
            prev.data = -1
         
        curr = curr.next
        prev = prev.next
     
    curr = head
 
    # change all the nodes with -1 to 0
    while curr != None:
        if curr.data == -1:
            curr.data = 0
 
        curr = curr.next
     
# Driver Code
if __name__ == "__main__":
 
    # creating the linked list
    head = Node(2)
    head.next = Node(3)
    head.next.next = Node(4)
    head.next.next.next = Node(5)
    head.next.next.next.next = Node(0)
    head.next.next.next.next.next = Node(9)
    head.next.next.next.next.next.next = Node(0)
    head.next.next.next.next.next.next.next = Node(9)
 
    updateAdjacent(head)
 
    printList(head)
 
# This code is contributed by Rituraj Jain


C#
// C# program to update the adjacent
// nodes in a linked list
using System;
 
class GFG
{
 
// A linked list node
public class Node
{
    public int data;
    public Node next;
}
 
// Utility function to create a new Node
static Node newNode(int data)
{
    Node temp = new Node();
    temp.data = data;
    temp.next = null;
 
    return temp;
}
 
// Function to display the linked list
static void printList(Node node)
{
    // iterate until end of the list is reached
    while (node != null)
    {
        Console.Write(node.data + " ");
 
        node = node.next;
    }
}
 
// Function to update the adjacent
// nodes to zero
static void updateAdjacent(Node head)
{
    // Pointer to point to
    // the previous node
    Node prev = head;
 
    // Pointer to the
    // current node
    Node curr = head.next;
 
    // If the first node is zero and the
    // second node is not zero then change
    // the value to -1
    if (prev.data == 0 && curr.data != 0)
        curr.data = -1;
 
    // Temp variable to denote if the
    // current node is zero then the next
    // node will be changed to zero
    int temp = 0;
 
    while (curr != null)
    {
 
        // if the temp variable is 1 and
        // current data is not zero
        if (temp == 1 && curr.data != 0)
        {
 
            // change the data to -1
            curr.data = -1;
            temp = 0;
        }
 
        // if the data is zero
        if (curr.data == 0)
        {
 
            // set the temp variable to 1
            temp = 1;
 
            // set the previous node data to -1
            prev.data = -1;
        }
 
        curr = curr.next;
        prev = prev.next;
    }
 
    curr = head;
 
    // change all the nodes with -1 to 0
    while (curr != null)
    {
        if (curr.data == -1)
            curr.data = 0;
 
        curr = curr.next;
    }
}
 
// Driver code
public static void Main(String[] args)
{
    // creating the linked list
    Node head = newNode(2);
    head.next = newNode(3);
    head.next.next = newNode(4);
    head.next.next.next = newNode(5);
    head.next.next.next.next = newNode(0);
    head.next.next.next.next.next = newNode(9);
    head.next.next.next.next.next.next = newNode(0);
    head.next.next.next.next.next.next.next = newNode(9);
 
    updateAdjacent(head);
 
    printList(head);
}
}
 
// This code contributed by Rajput-Ji


Javascript


输出:
2 3 4 0 0 0 0 0

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