Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 연결 목록 점프

<시간/>

양수를 포함하는 단일 연결 목록 노드가 있다고 가정합니다. 모든 노드의 다음이 앞의 노드 val 노드를 가리키는 동일한 연결 목록을 찾아야 합니다. 그러한 노드를 찾을 수 없으면 next는 null이 됩니다.

따라서 입력이 [2,3,10,5,9]와 같으면 출력은 [2, 3, 15, ]

가 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 배열 정의 v

  • 노드가 null이 아닌 동안 수행 -

    • 노드의 값을 v

      에 삽입
    • 노드 :=노드의 다음

  • ret =값이 0인 새 목록 노드

  • 온도 =재

  • 나는 :=0

  • i

    • 다음 temp :=값이 v[i]

      인 새 목록 노드
    • temp :=temp의 다음

    • 나는 :=나는 + v[i]

  • ret의 다음 반환

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

#include <bits/stdc++.h>
using namespace std;
class ListNode {
   public:
   int val;
   ListNode *next;
   ListNode(int data) {
      val = data;
      next = NULL;
   }
};
ListNode *make_list(vector<int> v) {
   ListNode *head = new ListNode(v[0]);
   for (int i = 1; i < v.size(); i++) {
      ListNode *ptr = head;
      while (ptr->next != NULL) {
         ptr = ptr->next;
      }
      ptr->next = new ListNode(v[i]);
   }
   return head;
}
void print_list(ListNode *head) {
   ListNode *ptr = head;
   cout << "[";
   while (ptr) {
      cout << ptr->val << ", ";
      ptr = ptr->next;
   }
   cout << "]" << endl;
}
class Solution {
   public:
   ListNode* solve(ListNode* node) {
      vector <int> v;
      while(node){
         v.push_back(node->val);
         node = node->next;
      }
      ListNode* ret = new ListNode(0);
      ListNode* temp = ret;
      int i = 0;
      while(i < v.size()){
         temp->next = new ListNode(v[i]);
         temp = temp->next;
         i += v[i];
      }
      return ret->next;
   }
};
main(){
   Solution ob;
   vector<int> v = {2,2,3,5,9,15,3,4};
   ListNode *head = make_list(v);
   print_list(ob.solve(head));
}

입력

{2,2,3,5,9,15,3,4}

출력

[2, 3, 15, ]