#java #linked-list
#java #связанный список
Вопрос:
Когда я практикую LinkedList. Я допустил действительно неожиданную ошибку Error - Found cycle in the ListNode
. Я пытаюсь выполнить поиск в Интернете, но не получаю удовлетворительного результата и проверяю свой код почти 5 раз. К сожалению, я потерпел неудачу. Я сам изучаю код, поэтому я почти не могу найти парней, которые помогли бы мне в реальности. Я буду очень признателен, если вы сможете мне помочь! Это URL-адрес leetcode: https://leetcode.com/problems/swap-nodes-in-pairs / Я предполагаю, что во втором цикле for что-то не так. Мой код выглядит следующим образом:
class Solution {
public ListNode swapPairs(ListNode head) {
// get the length of head
ListNode q = head;
int length = 0;
while (q != null) {
length ;
q = q.next;
}
// make a dumHead
ListNode dumHead = new ListNode(0);
q = dumHead;
//use loops for length/2 times and each time swap two ListNode
for (int i = 0; i < length / 2; i ) {
ListNode mid = head;
head = head.next;
q.next = head;
head = head.next;
q = q.next;
q.next = mid;
q = q.next;
}
// if there is still a single ListNode, just add it!
if (head != null) {
q.next = head;
}
return dumHead.next;
}
}
Ответ №1:
Было бы намного проще решить проблему рекурсивно:
public class Solution {
public static final ListNode swapPairs(
final ListNode head
) {
if (head == null || head.next == null) {
return head;
}
final ListNode swappedHead = head.next;
head.next = swapPairs(head.next.next);
swappedHead.next = head;
return swappedHead;
}
}
Вот итеративное решение LeetCode (с комментариями), использующее сторожевой узел, похожий на ваш:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
// Dummy node acts as the prevNode for the head node
// of the list and hence stores pointer to the head node.
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode prevNode = dummy;
while ((head != null) amp;amp; (head.next != null)) {
// Nodes to be swapped
ListNode firstNode = head;
ListNode secondNode = head.next;
// Swapping
prevNode.next = secondNode;
firstNode.next = secondNode.next;
secondNode.next = firstNode;
// Reinitializing the head and prevNode for next swap
prevNode = firstNode;
head = firstNode.next; // jump
}
// Return the new head node.
return dummy.next;
}
}