logo

루프가 포함된 연결 목록이 회문인지 아닌지 확인하세요.

루프가 있는 연결 리스트가 주어지면 그것이 회문인지 아닌지를 찾는 것이 임무입니다. 루프를 제거하는 것은 허용되지 않습니다.  

루프가 포함된 연결 목록이 회문인지 아닌지 확인하세요.' title=

예:   



Input : 1 -> 2 -> 3 -> 2 /| |/ ------- 1 Output: Palindrome Linked list is 1 2 3 2 1 which is a palindrome. Input : 1 -> 2 -> 3 -> 4 /| |/ ------- 1 Output: Not Palindrome Linked list is 1 2 3 4 1 which is a not palindrome. 

연산:

  1. 플로이드 사이클 감지 알고리즘을 사용하여 루프를 감지합니다.
  2. 그런 다음 설명된 대로 루프의 시작 노드를 찾습니다. 이것
  3. 연결된 목록이 회문인지 확인하세요. 이것

아래는 구현입니다. 

C++
// C++ program to check if a linked list with // loop is palindrome or not. #include   using namespace std; /* Link list node */ struct Node {  int data;  struct Node * next; }; /* Function to find loop starting node. loop_node --> Pointer to one of the loop nodes head --> Pointer to the start node of the linked list */ Node* getLoopstart(Node *loop_node Node *head) {  Node *ptr1 = loop_node;  Node *ptr2 = loop_node;  // Count the number of nodes in loop  unsigned int k = 1 i;  while (ptr1->next != ptr2)  {  ptr1 = ptr1->next;  k++;  }  // Fix one pointer to head  ptr1 = head;  // And the other pointer to k nodes after head  ptr2 = head;  for (i = 0; i < k; i++)  ptr2 = ptr2->next;  /* Move both pointers at the same pace  they will meet at loop starting node */  while (ptr2 != ptr1)  {  ptr1 = ptr1->next;  ptr2 = ptr2->next;  }  return ptr1; } /* This function detects and find loop starting  node in the list*/ Node* detectAndgetLoopstarting(Node *head) {  Node *slow_p = head *fast_p = head*loop_start;  //Start traversing list and detect loop  while (slow_p && fast_p && fast_p->next)  {  slow_p = slow_p->next;  fast_p = fast_p->next->next;  /* If slow_p and fast_p meet then find  the loop starting node*/  if (slow_p == fast_p)  {  loop_start = getLoopstart(slow_p head);  break;  }  }  // Return starting node of loop  return loop_start; } // Utility function to check if a linked list with loop // is palindrome with given starting point. bool isPalindromeUtil(Node *head Node* loop_start) {  Node *ptr = head;  stack<int> s;  // Traverse linked list until last node is equal  // to loop_start and store the elements till start  // in a stack  int count = 0;  while (ptr != loop_start || count != 1)  {  s.push(ptr->data);  if (ptr == loop_start)  count = 1;  ptr = ptr->next;  }  ptr = head;  count = 0;  // Traverse linked list until last node is  // equal to loop_start second time  while (ptr != loop_start || count != 1)  {  // Compare data of node with the top of stack  // If equal then continue  if (ptr->data == s.top())  s.pop();  // Else return false  else  return false;  if (ptr == loop_start)  count = 1;  ptr = ptr->next;  }  // Return true if linked list is palindrome  return true; } // Function to find if linked list is palindrome or not bool isPalindrome(Node* head) {  // Find the loop starting node  Node* loop_start = detectAndgetLoopstarting(head);  // Check if linked list is palindrome  return isPalindromeUtil(head loop_start); } Node *newNode(int key) {  Node *temp = new Node;  temp->data = key;  temp->next = NULL;  return temp; } /* Driver program to test above function*/ int main() {  Node *head = newNode(50);  head->next = newNode(20);  head->next->next = newNode(15);  head->next->next->next = newNode(20);  head->next->next->next->next = newNode(50);  /* Create a loop for testing */  head->next->next->next->next->next = head->next->next;  isPalindrome(head)? cout << 'nPalindrome'  : cout << 'nNot Palindrome';  return 0; } 
Java
// Java program to check if a linked list // with loop is palindrome or not. import java.util.*; class GfG  { /* Link list node */ static class Node  {   int data;   Node next;  } /* Function to find loop starting node.  loop_node --> Pointer to one of  the loop nodes head --> Pointer to  the start node of the linked list */ static Node getLoopstart(Node loop_node   Node head)  {   Node ptr1 = loop_node;   Node ptr2 = loop_node;   // Count the number of nodes in loop   int k = 1 i;   while (ptr1.next != ptr2)   {   ptr1 = ptr1.next;   k++;   }   // Fix one pointer to head   ptr1 = head;   // And the other pointer to k   // nodes after head   ptr2 = head;   for (i = 0; i < k; i++)   ptr2 = ptr2.next;   /* Move both pointers at the same pace   they will meet at loop starting node */  while (ptr2 != ptr1)   {   ptr1 = ptr1.next;   ptr2 = ptr2.next;   }   return ptr1;  }  /* This function detects and find  loop starting node in the list*/ static Node detectAndgetLoopstarting(Node head)  {   Node slow_p = head fast_p = headloop_start = null;   //Start traversing list and detect loop   while (slow_p != null && fast_p != null &&   fast_p.next != null)   {   slow_p = slow_p.next;   fast_p = fast_p.next.next;   /* If slow_p and fast_p meet then find   the loop starting node*/  if (slow_p == fast_p)   {   loop_start = getLoopstart(slow_p head);   break;   }   }   // Return starting node of loop   return loop_start;  }  // Utility function to check if  // a linked list with loop is  // palindrome with given starting point.  static boolean isPalindromeUtil(Node head  Node loop_start)  {   Node ptr = head;   Stack<Integer> s = new Stack<Integer> ();   // Traverse linked list until last node   // is equal to loop_start and store the   // elements till start in a stack   int count = 0;   while (ptr != loop_start || count != 1)   {   s.push(ptr.data);   if (ptr == loop_start)   count = 1;   ptr = ptr.next;   }   ptr = head;   count = 0;   // Traverse linked list until last node is   // equal to loop_start second time   while (ptr != loop_start || count != 1)   {   // Compare data of node with the top of stack   // If equal then continue   if (ptr.data == s.peek())   s.pop();   // Else return false   else  return false;   if (ptr == loop_start)   count = 1;   ptr = ptr.next;   }   // Return true if linked list is palindrome   return true;  }  // Function to find if linked list // is palindrome or not  static boolean isPalindrome(Node head)  {   // Find the loop starting node   Node loop_start = detectAndgetLoopstarting(head);   // Check if linked list is palindrome   return isPalindromeUtil(head loop_start);  }  static Node newNode(int key)  {   Node temp = new Node();   temp.data = key;   temp.next = null;   return temp;  }  /* Driver code*/ public static void main(String[] args)  {   Node head = newNode(50);   head.next = newNode(20);   head.next.next = newNode(15);   head.next.next.next = newNode(20);   head.next.next.next.next = newNode(50);   /* Create a loop for testing */  head.next.next.next.next.next = head.next.next;   if(isPalindrome(head) == true)  System.out.println('Palindrome');  else  System.out.println('Not Palindrome');  } }  // This code is contributed by prerna saini 
Python
# Python3 program to check if a linked list # with loop is palindrome or not. # Node class  class Node: # Constructor to initialize the node object  def __init__(self data): self.data = data self.next = None # Function to find loop starting node.  # loop_node -. Pointer to one of  # the loop nodes head -. Pointer to  # the start node of the linked list def getLoopstart(loop_nodehead): ptr1 = loop_node ptr2 = loop_node # Count the number of nodes in loop  k = 1 i = 0 while (ptr1.next != ptr2): ptr1 = ptr1.next k = k + 1 # Fix one pointer to head  ptr1 = head # And the other pointer to k  # nodes after head  ptr2 = head i = 0 while ( i < k ) : ptr2 = ptr2.next i = i + 1 # Move both pointers at the same pace  #they will meet at loop starting node */ while (ptr2 != ptr1): ptr1 = ptr1.next ptr2 = ptr2.next return ptr1 # This function detects and find  # loop starting node in the list def detectAndgetLoopstarting(head): slow_p = head fast_p = head loop_start = None # Start traversing list and detect loop  while (slow_p != None and fast_p != None and fast_p.next != None) : slow_p = slow_p.next fast_p = fast_p.next.next # If slow_p and fast_p meet then find  # the loop starting node if (slow_p == fast_p) : loop_start = getLoopstart(slow_p head) break # Return starting node of loop  return loop_start # Utility function to check if  # a linked list with loop is  # palindrome with given starting point.  def isPalindromeUtil(head loop_start): ptr = head s = [] # Traverse linked list until last node  # is equal to loop_start and store the  # elements till start in a stack  count = 0 while (ptr != loop_start or count != 1): s.append(ptr.data) if (ptr == loop_start) : count = 1 ptr = ptr.next ptr = head count = 0 # Traverse linked list until last node is  # equal to loop_start second time  while (ptr != loop_start or count != 1): # Compare data of node with the top of stack  # If equal then continue  if (ptr.data == s[-1]): s.pop() # Else return False  else: return False if (ptr == loop_start) : count = 1 ptr = ptr.next # Return True if linked list is palindrome  return True # Function to find if linked list # is palindrome or not  def isPalindrome(head) : # Find the loop starting node  loop_start = detectAndgetLoopstarting(head) # Check if linked list is palindrome  return isPalindromeUtil(head loop_start) def newNode(key) : temp = Node(0) temp.data = key temp.next = None return temp # Driver code head = newNode(50) head.next = newNode(20) head.next.next = newNode(15) head.next.next.next = newNode(20) head.next.next.next.next = newNode(50) # Create a loop for testing  head.next.next.next.next.next = head.next.next if(isPalindrome(head) == True): print('Palindrome') else: print('Not Palindrome') # This code is contributed by Arnab Kundu 
C#
// C# program to check if a linked list // with loop is palindrome or not. using System; using System.Collections.Generic;  class GfG  { /* Link list node */ class Node  {   public int data;   public Node next;  } /* Function to find loop starting node.  loop_node --> Pointer to one of  the loop nodes head --> Pointer to  the start node of the linked list */ static Node getLoopstart(Node loop_node   Node head)  {   Node ptr1 = loop_node;   Node ptr2 = loop_node;   // Count the number of nodes in loop   int k = 1 i;   while (ptr1.next != ptr2)   {   ptr1 = ptr1.next;   k++;   }   // Fix one pointer to head   ptr1 = head;   // And the other pointer to k   // nodes after head   ptr2 = head;   for (i = 0; i < k; i++)   ptr2 = ptr2.next;   /* Move both pointers at the same pace   they will meet at loop starting node */  while (ptr2 != ptr1)   {   ptr1 = ptr1.next;   ptr2 = ptr2.next;   }   return ptr1;  }  /* This function detects and find  loop starting node in the list*/ static Node detectAndgetLoopstarting(Node head)  {   Node slow_p = head fast_p = headloop_start = null;   //Start traversing list and detect loop   while (slow_p != null && fast_p != null &&   fast_p.next != null)   {   slow_p = slow_p.next;   fast_p = fast_p.next.next;   /* If slow_p and fast_p meet then find   the loop starting node*/  if (slow_p == fast_p)   {   loop_start = getLoopstart(slow_p head);   break;   }   }   // Return starting node of loop   return loop_start;  }  // Utility function to check if  // a linked list with loop is  // palindrome with given starting point.  static bool isPalindromeUtil(Node head  Node loop_start)  {   Node ptr = head;   Stack<int> s = new Stack<int> ();   // Traverse linked list until last node   // is equal to loop_start and store the   // elements till start in a stack   int count = 0;   while (ptr != loop_start || count != 1)   {   s.Push(ptr.data);   if (ptr == loop_start)   count = 1;   ptr = ptr.next;   }   ptr = head;   count = 0;   // Traverse linked list until last node is   // equal to loop_start second time   while (ptr != loop_start || count != 1)   {   // Compare data of node with the top of stack   // If equal then continue   if (ptr.data == s.Peek())   s.Pop();   // Else return false   else  return false;   if (ptr == loop_start)   count = 1;   ptr = ptr.next;   }   // Return true if linked list is palindrome   return true;  }  // Function to find if linked list // is palindrome or not  static bool isPalindrome(Node head)  {   // Find the loop starting node   Node loop_start = detectAndgetLoopstarting(head);   // Check if linked list is palindrome   return isPalindromeUtil(head loop_start);  }  static Node newNode(int key)  {   Node temp = new Node();   temp.data = key;   temp.next = null;   return temp;  }  /* Driver code*/ public static void Main(String[] args)  {   Node head = newNode(50);   head.next = newNode(20);   head.next.next = newNode(15);   head.next.next.next = newNode(20);   head.next.next.next.next = newNode(50);   /* Create a loop for testing */  head.next.next.next.next.next = head.next.next;   if(isPalindrome(head) == true)  Console.WriteLine('Palindrome');  else  Console.WriteLine('Not Palindrome');  } } /* This code is contributed by 29AjayKumar */ 
JavaScript
<script> // javascript program to check if a linked list // with loop is palindrome or not.class GfG {  /* Link list node */  class Node {  constructor() {  this.data = 0;  this.next = null;  }  }  /*  * Function to find loop starting node. loop_node --> Pointer to one of the loop  * nodes head --> Pointer to the start node of the linked list  */  function getLoopstart(loop_node head) {  var ptr1 = loop_node;  var ptr2 = loop_node;  // Count the number of nodes in loop  var k = 1 i;  while (ptr1.next != ptr2) {  ptr1 = ptr1.next;  k++;  }  // Fix one pointer to head  ptr1 = head;  // And the other pointer to k  // nodes after head  ptr2 = head;  for (i = 0; i < k; i++)  ptr2 = ptr2.next;  /*  * Move both pointers at the same pace they will meet at loop starting node  */  while (ptr2 != ptr1) {  ptr1 = ptr1.next;  ptr2 = ptr2.next;  }  return ptr1;  }  /*  * This function detects and find loop starting node in the list  */  function detectAndgetLoopstarting(head) {  var slow_p = head fast_p = head loop_start = null;  // Start traversing list and detect loop  while (slow_p != null && fast_p != null && fast_p.next != null) {  slow_p = slow_p.next;  fast_p = fast_p.next.next;  /*  * If slow_p and fast_p meet then find the loop starting node  */  if (slow_p == fast_p) {  loop_start = getLoopstart(slow_p head);  break;  }  }  // Return starting node of loop  return loop_start;  }  // Utility function to check if  // a linked list with loop is  // palindrome with given starting point.  function isPalindromeUtil(head loop_start) {  var ptr = head;  var s = [];  // Traverse linked list until last node  // is equal to loop_start and store the  // elements till start in a stack  var count = 0;  while (ptr != loop_start || count != 1) {  s.push(ptr.data);  if (ptr == loop_start)  count = 1;  ptr = ptr.next;  }  ptr = head;  count = 0;  // Traverse linked list until last node is  // equal to loop_start second time  while (ptr != loop_start || count != 1) {  // Compare data of node with the top of stack  // If equal then continue  var stk = s.pop();  if (ptr.data == stk);    // Else return false  else{  s.push(stk);  return false;  }  if (ptr == loop_start)  count = 1;  ptr = ptr.next;  }  // Return true if linked list is palindrome  return true;  }  // Function to find if linked list  // is palindrome or not  function isPalindrome(head) {  // Find the loop starting node  var loop_start = detectAndgetLoopstarting(head);  // Check if linked list is palindrome  return isPalindromeUtil(head loop_start);  }  function newNode(key) {  var temp = new Node();  temp.data = key;  temp.next = null;  return temp;  }  /* Driver code */    var head = newNode(50);  head.next = newNode(20);  head.next.next = newNode(15);  head.next.next.next = newNode(20);  head.next.next.next.next = newNode(50);  /* Create a loop for testing */  head.next.next.next.next.next = head.next.next;  if (isPalindrome(head) == true)  document.write('Palindrome');  else  document.write('Not Palindrome'); // This code contributed by aashish1995  </script> 

산출
Palindrome

시간 복잡도: O(n) 
보조 공간: O(n) 

 

퀴즈 만들기