牛客网高频算法题系列-BM15-删除有序链表中重复的元素-I

题目描述

删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次

原题目见:BM15 删除有序链表中重复的元素-I

解法一:链表遍历

首先,考虑特殊情况,如果链表为空或者只有一个结点,不会有重复的元素,返回原链表。

否则,遍历链表结点,判断是否有重复的元素,处理过程如下:

  • 使用pre记录上一个未重复的结点,初始化为链表头;
  • 然后从链表的第二个结点next开始遍历链表结点;
  • 如果next和pre的值相同,则删除当前重复结点;
  • 如果next和pre的值不相同,则更新pre的值。

遍历完成后,链表的头结点并没有变化,返回头结点即可。

代码

  1. public class Bm015 {
  2. /**
  3. * 删除有序链表中重复的元素-I
  4. *
  5. * @param head ListNode类
  6. * @return ListNode类
  7. */
  8. public static ListNode deleteDuplicates(ListNode head) {
  9. // 如果链表为空或者只有一个结点,不会有重复的元素,返回原链表
  10. if (head == null || head.next == null) {
  11. return head;
  12. }
  13. // pre记录上一个未重复的结点
  14. // next为从第二个节点开始判断是否有重复元素
  15. ListNode pre = head, next = head.next;
  16. // 遍历链表
  17. while (next != null) {
  18. // 如果当前结点的值和pre的值相同,则要删掉当前结点,修改pre的next指针即可
  19. if (pre.val == next.val) {
  20. pre.next = next.next;
  21. } else {
  22. // 如果当前结点未重复,则更新pre
  23. pre = next;
  24. }
  25. next = next.next;
  26. }
  27. return head;
  28. }
  29. public static void main(String[] args) {
  30. ListNode head = ListNode.testCase6();
  31. System.out.println("原链表为");
  32. ListNode.print(head);
  33. System.out.println("删除有序链表中重复的元素后的链表为");
  34. ListNode.print(deleteDuplicates(head));
  35. }
  36. }

牛客网高频算法题系列-BM15-删除有序链表中重复的元素-I - 图1
牛客网高频算法题系列-BM15-删除有序链表中重复的元素-I - 图2
相信坚持的力量!