C++ 中的連結串列跳轉


假設我們有一個包含正數的單鏈表節點。我們必須找到同一個連結串列,其中每個節點的 next 都指向節點 val 個節點之後的一個節點。如果找不到這樣的節點,next 將為 null。

因此,如果輸入類似 [2,3,10,5,9],則輸出將為 [2, 3, 15, ]

要解決此問題,我們將遵循以下步驟:

  • 定義一個數組 v

  • 當節點不為 null 時,執行以下操作:-

    • 將節點的值插入 v

    • node := node 的 next

  • ret = 新的連結串列節點,值為 0

  • temp = ret

  • i := 0

  • 當 i < v 的 size 時,執行以下操作:-

    • temp 的 next := 新的連結串列節點,值為 v[i]

    • temp := temp 的 next

    • i := i + v[i]

  • 返回 ret 的 next

讓我們看看以下實現,以便獲得更好的理解:

示例

 線上演示

#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, ]

更新於: 02-Sep-2020

289 次瀏覽

開啟你的職業生涯

完成課程認證

立即開始
廣告
© . All rights reserved.