Partage de technologie

Déduplication de liste chaînée ordonnée de Likou

2024-07-12

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

Supprimez les éléments en double dans la liste chaînée et conservez un élément en double

p1 p2
1 -> 1 -> 2 -> 3 -> 3 -> nul

p1.val == p2.val puis supprimez p2, notez que p1 reste inchangé à ce moment

p1 p2
1 -> 2 -> 3 -> 3 -> nul

p1.val != p2.val Puis p1, p2 reculent

p1 p2
1 -> 2 -> 3 -> 3 -> nul
         
p1 p2
1 -> 2 -> 3 -> 3 -> nul

p1.val == p2.val puis supprimez p2

p1 p2
1 -> 2 -> 3 -> nul

Quand p2 == null quitte la boucle

code

  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. }

Ne conserver aucun élément en double

p1 est le nœud précédent à supprimer. Chaque cycle compare les valeurs de p2 et p3.

  • Si les valeurs de p2 et p3 sont répétées, alors p3 continue de reculer jusqu'à ce qu'un nœud qui n'est pas dupliqué avec p2 soit trouvé, et p1 pointe vers p3 pour terminer la suppression.

  • Si les valeurs de p2 et p3 ne se chevauchent pas, p1, p2 et p3 sont décalés vers l'arrière d'une position et continuent l'opération ci-dessus.

  • p2 ou p3 est nul, quittez la boucle

    • Lorsque p2 est nul, par exemple, la liste chaînée est 1 1 1 null

 

p1 p2 p3
s, 1, 1, 1, 2, 3, nul

p1 p2 p3
s, 1, 1, 1, 2, 3, nul

p1 p2 p3
s, 1, 1, 1, 2, 3, nul

p1 p3
s, 2, 3, nul

p1 p2 p3
s, 2, 3, nul

p1 p2 p3
s, 2, 3, nul

code

  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. }