Строка для односвязного списка

Я пытаюсь преобразовать строку в связанный список, где каждая цифра находится в отдельном узле.

Я включил его, пытаясь отладить, но не могу понять, что не так с моей логикой. Я продолжаю получать странное двузначное число в каждом узле и не обязательно даже цифры, которые появляются в строке.

Обратите внимание, что ListNode — это класс, с которым я создаю новый объект узла.

String number = "807";
   
int size = number.length();
int pos = 0;
ListNode dummyhead = new ListNode();
ListNode curr = dummyhead;
while (size > 0){
    curr.next = new ListNode(number.charAt(pos));   
    pos++;
    size--;
    curr = curr.next;
}

return dummyhead.next;

person Michal Moryosef    schedule 13.08.2020    source источник


Ответы (2)


Я думаю, ты на правильном пути. Метод работает нормально, но кажется, что вы неправильно повторяете список. Вот как я тестировал ваш код:

public class ListNode{
    ListNode next;
    char data;
    public ListNode(char data) {
        this.data = data;
    }
    public ListNode() {}
}
private static ListNode getList(String number){
    int size = number.length();
    int pos = 0;
    ListNode dummyhead = new ListNode();
    ListNode curr = dummyhead;
    while (size > 0){
        curr.next = new ListNode(number.charAt(pos));   
        pos++;
        size--;
        curr = curr.next;
   }
   return dummyhead.next;
}
private static String printList(ListNode head) {
    ListNode n = head;
    StringBuilder sb = new StringBuilder();
    while(n != null) {
        sb.append(n.data+"-");
        n = n.next;
    }
    return sb.toString();
}
public static void main(String[] args) {
    String number = "807";
    System.out.println(printList(getList(number)));
}

Выход:

8-0-7-
person Majed Badawi    schedule 13.08.2020

charAt возвращает символ указанной позиции. char — это числовой тип, но он представляет собой ascii-адрес символа, который он представляет.

"807".charAt(0)

возвращает 56, потому что это значение ascii 8.

Я подозреваю, что у вас есть поле int data внутри ListNode, которое сохраняет это char в обычное int.

Таким образом, ваш 807 будет преобразован в список чисел 56, 48, 55.

Очевидно, вы хотите сохранить это "8" в узле, поэтому используйте

while (size > 0){
  //for pos=0, this converts the string "8" to the integer 8:
  Integer n = Integer.valueOf(number.substring(pos, pos+1));
  curr.next = new ListNode(n);

Или, как предлагает Маджед в своем ответе, измените тип вашего поля data внутри ListNode на char.

person f1sh    schedule 13.08.2020