สมมติว่าเรามีจำนวนเต็มที่ไม่ติดลบซึ่งแสดงเป็นรายการตัวเลขที่เชื่อมโยงเพียงอย่างเดียว ตอนนี้เราต้องบวกหนึ่งกับจำนวนเต็ม เราอาจถือว่าจำนวนเต็มไม่มีศูนย์นำหน้า ยกเว้นตัวเลข 0 เอง ในรายการที่เชื่อมโยง ตัวเลขที่สำคัญที่สุดอยู่ที่ส่วนหัวของรายการ
ดังนั้น หากอินพุตเป็น [1,2,3] ผลลัพธ์จะเป็น [1,2,4]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ถ้า head เป็นโมฆะ −
-
กลับหัว
-
-
curr =หัว
-
คำขอ =NULL
-
ในขณะที่ค่าเงินไม่เป็นศูนย์ ให้ทำ -
-
ถ้าวาลของเคอร์ไม่เท่ากับ 9 แล้ว −
-
req :=สกุลเงิน
-
-
curr :=ถัดไปของ curr
-
-
ถ้าไม่ต้องการก็ไม่ใช่ศูนย์ ดังนั้น −
-
dummy =โหนดใหม่ที่มีค่า 1
-
ข้างหุ่น :=หัว
-
ในขณะที่หัวไม่เป็นศูนย์ให้ทำ -
-
วาลของหัว :=0
-
head :=ข้างหัว
-
-
หุ่นกลับมา
-
-
มิฉะนั้น
-
เพิ่ม val ของ req ขึ้น 1
-
req :=ถัดไปของ req
-
ในขณะที่ req ไม่ใช่ศูนย์ ให้ทำ -
-
val ของ req :=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, ]