การแสดงรายการเชื่อมโยงของตัวเลขมีให้ในลักษณะที่โหนดทั้งหมดของรายการที่เชื่อมโยงถือเป็นตัวเลขหนึ่งหลัก โหนดเก็บตัวเลขดังกล่าวเพื่อให้องค์ประกอบแรกของรายการที่เชื่อมโยงถือหลักที่สำคัญที่สุดของตัวเลข และองค์ประกอบสุดท้ายของรายการที่เชื่อมโยงเก็บบิตที่มีนัยสำคัญน้อยที่สุดของตัวเลข ตัวอย่างเช่น หมายเลข 202345 จะแสดงในรายการที่เชื่อมโยงเป็น (2->0->2->3->4->5)
และในการเพิ่มหมายเลขที่แสดงในรายการที่เชื่อมโยงนี้ เราต้องตรวจสอบค่าของบิตที่มีนัยสำคัญน้อยที่สุดของรายการ หากน้อยกว่า 9 ก็ไม่เป็นไร มิฉะนั้นรหัสจะเปลี่ยนหลักถัดไปเป็นต้น
ตอนนี้มาดูตัวอย่างเพื่อทราบวิธีการทำ 1999 แสดงเป็น (1-> 9-> 9 -> 9) และการเพิ่ม 1 เข้าไปควรเปลี่ยนเป็น (2->0->0->0)
Input:1999 Output:2000
คำอธิบาย
การเพิ่ม 1 ให้กับหมายเลขที่กำหนดซึ่งแสดงเป็นรายการเชื่อมโยงหมายถึงทำตามขั้นตอนบางอย่างนั่นคือ
- การย้อนกลับของรายการที่เชื่อมโยง:คุณต้องย้อนกลับรายการที่เชื่อมโยง ซึ่งหมายถึงการเปลี่ยนหลักสุดท้ายเป็นตัวแรกและตัวแรกเป็นตัวเลขสุดท้าย ตัวอย่างเช่น 1-> 9-> 9 -> 9 จะถูกแปลงเป็น 9-> 9 -> 9 ->1
- สำหรับรายการที่เชื่อมโยงที่เปลี่ยนแปลงนี้ ให้ข้ามรายการในโหนดด้านซ้ายสุด เพิ่มหนึ่งรายการ หากค่าของโหนดนี้เท่ากับ 9 ให้ส่งต่อไปยังโหนดถัดไป ทำขั้นตอนเดียวกันจนกว่าจะถึงเวลาพกพา
- ย้อนกลับสตริงกลับในรูปแบบเดิมแล้วคืนส่วนหัวเพื่อพิมพ์สตริง
ตัวอย่าง
#include <iostream> using namespace std; //n=next node ; d=data ; p= previous node; h=head node; c=current node class Node { public: int d; Node* n; }; Node *newNode(int d) { Node *new_node = new Node; new_node->d = d; new_node->n = NULL; return new_node; } Node *reverse(Node *h) { Node * p = NULL; Node * c = h; Node * n; while (c != NULL) { n = c->n; c->n = p; p = c; c = n; } return p; } Node *addOneUtil(Node *h) { Node* res = h; Node *temp, *p = NULL; int carry = 1, sum; while (h != NULL) { sum = carry + h->d; carry = (sum >= 10)? 1 : 0; sum = sum % 10; h->d = sum; temp = h; h = h->n; } if (carry > 0) temp->n = newNode(carry); return res; } Node* addOne(Node *h) { h = reverse(h); h = addOneUtil(h); return reverse(h); } int main() { Node *h = newNode(1); h->n = newNode(9); h->n->n = newNode(9); h->n->n->n = newNode(9); h = addOne(h); while (h != NULL) { cout << h->d; h = h->n; } cout<<endl; return 0; }