1、题目描述
2、解题思路
本题需要特别注意的地方在于进位。
如果最后一个节点的值为 9 ,则最后一个节点变为 0,上一个节点加 1;
我们定义一个新的头结点 newHead,它的 next 为输入的 head;即:数字 123 变成数字 0123,不改变数字的大小。
现在不清楚链表的末尾到底连着有多少个 9,于是我们定义一个 attention 指向末尾为连续9情况下的右到左第一个非9的数字;
初始时:attention 指向 newHead,我们初始假设输入的数字全是 9;
接着定义一个指针节点 index ,初始时指向 newHead;
index 往下遍历:
1、如果 index.val != 9 并且 index.next.val == 9,说明有可能会进位,更新 attention = index;
2、当遍历到末尾时,判断此时 index.val 是否为 9:
2.1 index.val != 9,则直接末尾元素加一,返回头结点即可;
2.2 index.val == 9,说明需要进位,把从 attention 的下一个结点开始,到最末端元素,全置零,然后把 attention 的值加一;如果 newHead 的值为 0 ,说明进位没有影响到这里,返回 head;如果 newHead == 1,说明原来输入的数字全是 9,返回 newHead。
3、解题代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode plusOne(ListNode head) {
if (head == null) return head;
ListNode newHead = new ListNode(0);
newHead.next = head;
ListNode attention = newHead; // 它的下一个节点值为 9,万一需要进位
ListNode index = head;
while (index.next != null) {
if (index.val != 9 && index.next.val == 9) {
attention = index; // 下一个为 9,做好进位的准备
}
index = index.next;
}
if (index.val == 9) {
ListNode tmp = attention.next;
while (tmp != null) { // attention后面全变为 0
tmp.val = 0;
tmp = tmp.next;
}
attention.val = attention.val + 1;
} else {
index.val = index.val + 1;
}
return newHead.val == 0 ? newHead.next : newHead;
}
}