当前位置:  首页>> 技术小册>> 数据结构与算法(下)

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

解法

解法一:递归

  1. /**
  2. * @author bingo
  3. * @since 2018/11/21
  4. */
  5. /*
  6. public class ListNode {
  7. int val;
  8. ListNode next = null;
  9. ListNode(int val) {
  10. this.val = val;
  11. }
  12. }
  13. */
  14. public class Solution {
  15. /**
  16. * 删除链表重复的节点
  17. * @param pHead 链表头节点
  18. * @return 删除节点后的链表
  19. */
  20. public ListNode deleteDuplication(ListNode pHead) {
  21. if (pHead == null || pHead.next == null) {
  22. return pHead;
  23. }
  24. if (pHead.val == pHead.next.val) {
  25. if (pHead.next.next == null) {
  26. return null;
  27. }
  28. if (pHead.next.next.val == pHead.val) {
  29. return deleteDuplication(pHead.next);
  30. }
  31. return deleteDuplication(pHead.next.next);
  32. }
  33. pHead.next = deleteDuplication(pHead.next);
  34. return pHead;
  35. }
  36. }

解法二

  1. /*
  2. public class ListNode {
  3. int val;
  4. ListNode next = null;
  5. ListNode(int val) {
  6. this.val = val;
  7. }
  8. }
  9. */
  10. public class Solution {
  11. public ListNode deleteDuplication(ListNode pHead) {
  12. if (pHead == null || pHead.next == null) {
  13. return pHead;
  14. }
  15. ListNode pre = null;
  16. ListNode cur = pHead;
  17. while (cur != null) {
  18. if (cur.next != null && cur.next.val == cur.val) {
  19. int val = cur.val;
  20. while (cur.next != null && cur.next.val == val) {
  21. cur = cur.next;
  22. }
  23. if (pre == null) {
  24. pHead = cur.next;
  25. } else {
  26. pre.next = cur.next;
  27. }
  28. } else {
  29. pre = cur;
  30. }
  31. cur = cur.next;
  32. }
  33. return pHead;
  34. }
  35. }

测试用例

  1. 功能测试(重复的节点位于链表的头部/中间/尾部;链表中没有重复的节点);
  2. 特殊输入测试(指向链表头节点的为空指针;链表中所有节点都是重复的)。

该分类下的相关小册推荐: