C ++中的链表跳转

假设我们有一个包含正数的单链列表节点。我们必须找到相同的链表,其中每个节点的下一个指向前面的节点val节点。如果我们找不到这样的节点,则next将为null。

因此,如果输入类似于[2,3,10,5,9],则输出将为[2、3、15,]

为了解决这个问题,我们将遵循以下步骤-

  • 定义数组v

  • 当节点不为空时,执行-

    • 将节点的值插入v

    • 节点:=节点的下一个

  • ret =值为0的新列表节点

  • 温度= ret

  • i:= 0

  • 当我<v的大小时,-

    • temp的下一个:=值为v [i]的新列表节点

    • temp:=下一个温度

    • i:= i + 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, ]