Condivisione della tecnologia

Deduplicazione ordinata degli elenchi collegati di Likou

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Elimina gli elementi duplicati nell'elenco collegato e mantieni un elemento duplicato

la prima la seconda
1 -> 1 -> 2 -> 3 -> 3 -> null

p1.val == p2.val quindi elimina p2, nota che p1 rimane invariato in questo momento

la prima la seconda
1 -> 2 -> 3 -> 3 -> null

p1.val != p2.val Quindi p1, p2 si spostano indietro

la prima la seconda
1 -> 2 -> 3 -> 3 -> null
         
la prima la seconda
1 -> 2 -> 3 -> 3 -> null

p1.val == p2.val quindi elimina p2

prima e dopo
1 -> 2 -> 3 -> null

Quando p2 == null esci dal ciclo

codice

  1. public ListNode deleteDuplicates(ListNode head) {
  2. // 链表节点 < 2
  3. if (head == null || head.next == null) {
  4. return head;
  5. }
  6. // 链表节点 >= 2
  7. ListNode p1 = head;
  8. ListNode p2;
  9. while ((p2 = p1.next) != null) {
  10. if (p1.val == p2.val) {
  11. p1.next = p2.next;
  12. } else {
  13. p1 = p1.next;
  14. }
  15. }
  16. return head;
  17. }

Non conservare alcun elemento duplicato

p1 è il nodo precedente da eliminare. Ogni ciclo confronta i valori di p2 e p3.

  • Se i valori di p2 e p3 vengono ripetuti, p3 continua a spostarsi indietro finché non viene trovato un nodo che non è duplicato con p2 e p1 punta a p3 per completare la cancellazione.

  • Se i valori di p2 e p3 non si sovrappongono, p1, p2 e p3 vengono spostati indietro di una posizione e continuano l'operazione precedente.

  • p2 o p3 sono nulli, esci dal ciclo

    • Quando p2 è nullo, ad esempio, la lista concatenata è 1 1 1 null

 

la1 la2 la3
s, 1, 1, 1, 2, 3, null

la1 la2 la3
s, 1, 1, 1, 2, 3, null

la1 la2 la3
s, 1, 1, 1, 2, 3, null

pagina 1 pagina 3
s, 2, 3, null

la1 la2 la3
s, 2, 3, null

la1 la2 la3
s, 2, 3, null

codice

  1. public ListNode deleteDuplicates(ListNode head) {
  2. if (head == null || head.next == null) {
  3. return head;
  4. }
  5. ListNode s = new ListNode(-1, head);
  6. ListNode p1 = s;
  7. ListNode p2;
  8. ListNode p3;
  9. while ((p2 = p1.next) != null && (p3 = p2.next) != null) {
  10. if (p2.val == p3.val) {
  11. while ((p3 = p3.next) != null
  12. && p3.val == p2.val) {
  13. }
  14. p1.next = p3;
  15. } else {
  16. p1 = p1.next;
  17. }
  18. }
  19. return s.next;
  20. }