O título original:
Cole o código primeiro:
public class Solution328 {
public ListNode oddEvenList(ListNode head) {
//当链表为空时,直接返回
if (head == null){
return head;
}
//创建节点oddnum和节点evennum,始终指向奇数和偶数的最后一个节点
ListNode oddnum = head;
ListNode evennum = head.next;
//当evennum为最后一个节点时循环结束
while (evennum != null && evennum.next != null){
//创建一个cur指针,指向evennum的后继节点
ListNode cur = evennum.next;
//将evennum后面的那个奇数节点移到前面
evennum.next = cur.next;
cur.next = oddnum.next;
oddnum.next = cur;
//evennum和oddnum后移一步
oddnum = oddnum.next;
evennum = evennum.next;
}
return head;
}
}
Análise de ideias:
Nesta questão, somos solicitados a alinhar nós ímpares com nós ímpares e nós pares com nós pares, onde ímpar e par se referem ao número de nós; e precisamos usar o algoritmo no local para fazer isso. Portanto, precisamos operar diretamente na lista vinculada.
Como uma lista encadeada precisa ser dividida em uma parte ímpar e uma parte par, primeiro criamos dois ponteiros oddnum (ímpar) e evennum (par), apontando para o último nó da parte ímpar e o último nó da parte par, respectivamente. , para que possamos O nó sucessor de evennum é movido para trás de oddnum, porque evennum aponta para um nó de número par, então seu nó sucessor deve ser um nó de número ímpar.
Depois de mover o sucessor de evennum para trás de oddnum, mova ambos um passo para trás, de modo que sempre aponte para o último nó da parte ímpar ou par.
Como o título exige que a parte ímpar esteja na frente e a parte par fique atrás, podemos usar evennum para julgar o final do loop: quando evennum está vazio ou o nó sucessor de evennum está vazio, significa que a lista encadeada foi completada e o loop pode ser encerrado neste momento. Por fim, retorne ao nó principal.