C++ 中的加一連結串列


假設我們有一個以非空數字單鏈表形式表示的非負整數,現在我們必須將該整數加一。我們可以假設該整數不包含任何前導零,除了數字 0 本身。在連結串列中,最高有效數字位於連結串列的頭部。

因此,如果輸入類似於 [1,2,3],則輸出將為 [1,2,4]

要解決此問題,我們將按照以下步驟操作−

  • 如果頭部為 null,則−

    • 返回頭部

  • curr = 頭部

  • req = NULL

  • while curr 不為零,執行 −

    • 如果 curr 的 val 不等於 9,則 −

      • req := curr

    • curr := curr 的下一個

  • 如果 req 不為零,則 −

    • dummy = 新節點,值為 1

    • dummy 的下一個 := 頭部

    • while 頭部不為零,執行 −

      • 頭部的 val := 0

      • 頭部 := 頭部的下一個

    • 返回 dummy

  • 否則

    • req 的 val 加 1

    • req := req 的下一個

    • while req 不為零,執行 −

      • req 的 val := 0

      • req := req 的下一個

    • 返回頭部

示例 

讓我們看看以下實施,以便更好地理解。

 線上演示

#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* plusOne(ListNode* head) {
      if (!head)
         return head;
      ListNode* curr = head;
      ListNode* req = NULL;
      while (curr) {
         if (curr->val != 9) {
            req = curr;
         }
         curr = curr->next;
      }
      if (!req) {
         ListNode* dummy = new ListNode(1);
         dummy->next = head;
         while (head) {
            head->val = 0;
            head = head->next;
         }
         return dummy;
      }
      else {
         req->val++;
         req = req->next;
         while (req) {
            req->val = 0;
            req = req->next;
         }
         return head;
      }
   }
};
main(){
   Solution ob;
   vector<int< v = {1,4,5};
   ListNode *head = make_list(v);
   print_list(ob.plusOne(head));
}

輸入

{1,4,5}

輸出

[1, 4, 6, ]

更新於: 19-11-2020

155 次瀏覽

開啟您職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.