[关闭]
@XQF 2018-03-07T22:50:29.000000Z 字数 1614 阅读 1119

如何删除链表中重复数据

数据结构与算法


1.最笨办法

就是遍历出所有数据放入Set。然后重新建表,,,。,。

  1. class ListNode {
  2. int val;
  3. ListNode next;
  4. public ListNode(int val) {
  5. this.val = val;
  6. }
  7. }
  8. public class Test {
  9. // 获取有的链表重复
  10. public static ListNode getListNode() {
  11. ListNode head = null;
  12. ListNode p = null;
  13. for (int i = 0; i < 10; i++) {
  14. if (head == null) {
  15. head = new ListNode(i);
  16. p = head;
  17. } else {
  18. ListNode node = new ListNode(i);
  19. p.next = node;
  20. p = p.next;
  21. }
  22. }
  23. ListNode node = new ListNode(3);
  24. p.next = node;
  25. return head;
  26. }
  27. //打印链表
  28. public static void print(ListNode head) {
  29. while (null != head) {
  30. System.out.print(head.val + " ");
  31. head = head.next;
  32. }
  33. }
  34. public static void main(String[] args) {
  35. // print(getListNode());
  36. ListNode list = getListNode();
  37. print(list);
  38. //去重
  39. Set<Integer> set = new HashSet<>();
  40. ListNode head = list;
  41. while (null != head) {
  42. set.add(head.val);
  43. head = head.next;
  44. }
  45. System.out.println();
  46. //重建
  47. ListNode p = null;
  48. for (Integer i : set) {
  49. ListNode node = new ListNode(i);
  50. if (p == null) {
  51. p = node;
  52. head = p;
  53. } else {
  54. head.next = node;
  55. head = head.next;
  56. }
  57. }
  58. print(p);
  59. }
  60. }

2.不用一次遍历完再重建,直接中途判断跳过

  1. public static void main(String[] args) {
  2. // // print(getListNode());
  3. ListNode list = getListNode();
  4. print(list);
  5. // //去重
  6. Set<Integer> set = new HashSet<>();
  7. ListNode head = list;
  8. while (head != null) {
  9. if (set.contains(head.next.val)) {
  10. head.next = head.next.next;
  11. } else {
  12. set.add(head.val);
  13. }
  14. head = head.next;
  15. }
  16. System.out.println();
  17. print(list);
  18. }

关于跳中间一个找前一个点。前一个点就是当前点,当前的next不为空的情况下分两种情况,一种是当前点的.next.next仍不为空,说明可以跳过,若为空,说明这是表尾。直接把当前点的next置空就可以了。

3.这个有点像筛选法

  1. public static void main(String[] args) {
  2. // print(getListNode());
  3. ListNode list = getListNode();
  4. print(list);
  5. //去重
  6. ListNode p=list;
  7. ListNode q=list;
  8. while(null!=p){
  9. q=p;
  10. while(null!=q.next){
  11. if(p.val==q.next.val){
  12. q.next=q.next.next;
  13. }else {
  14. q=q.next;
  15. }
  16. }
  17. p=p.next;
  18. }
  19. System.out.println();
  20. print(list);
  21. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注