기술나눔

Likou의 순서 연결 목록 중복 제거

2024-07-12

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

연결된 목록에서 중복 요소를 삭제하고 중복 요소 하나를 유지합니다.

페이지 1 페이지 2
1 -> 1 -> 2 -> 3 -> 3 -> 널

p1.val == p2.val 그런 다음 p2를 삭제합니다. 이때 p1은 변경되지 않은 상태로 유지됩니다.

페이지 1 페이지 2
1 -> 2 -> 3 -> 3 -> 널

p1.val != p2.val 그런 다음 p1, p2가 뒤로 이동합니다.

페이지 1 페이지 2
1 -> 2 -> 3 -> 3 -> 널
         
페이지 1 페이지 2
1 -> 2 -> 3 -> 3 -> 널

p1.val == p2.val 그런 다음 p2를 삭제합니다.

페이지 1 페이지 2
1 -> 2 -> 3 -> 널

p2 == null일 때 루프를 종료합니다.

암호

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

중복된 요소를 유지하지 마세요

p1은 삭제할 이전 노드입니다. 각 주기마다 p2와 p3의 값을 비교합니다.

  • p2와 p3의 값이 반복되면 p3는 p2와 중복되지 않는 노드를 찾을 때까지 계속 뒤로 이동하고 p1은 p3을 가리키며 삭제를 완료합니다.

  • p2와 p3의 값이 겹치지 않으면 p1, p2, p3을 한 위치 뒤로 이동시켜 위의 동작을 계속한다.

  • p2 또는 p3이 null이면 루프를 종료합니다.

    • 예를 들어 p2가 null이면 연결된 목록은 1 1 1 null입니다.

 

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

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

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

페이지 1 페이지 3
s, 2, 3, 널

p1 p2 p3
s, 2, 3, 널

p1 p2 p3
s, 2, 3, 널

암호

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