刷题--删除链表中重复的节点

题目描述:

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

【解1】使用HashMap记录每个节点是否重复出现,时间复杂度为O(N),空间复杂度为O(N)

 1 import java.util.*;
 2
 3 /*
 4  public class ListNode {
 5     int val;
 6     ListNode next = null;
 7
 8     ListNode(int val) {
 9         this.val = val;
10     }
11 }
12 */
13 public class Solution {
14     public ListNode deleteDuplication(ListNode pHead)
15     {
16         // 解法1:使用hashMap记录个数
17         if(pHead==null)
18             return pHead;
19         HashMap<Integer, Boolean> map = new HashMap<Integer, Boolean>();
20         ListNode cur = pHead;
21         while(cur != null){
22             if(map.containsKey(cur.val) == false){
23                 map.put(cur.val, true);
24             }else{
25                 map.put(cur.val, false);
26             }
27             cur = cur.next;
28         }
29
30         Set<Integer> set = map.keySet();
31         boolean isfst = true;
32         ListNode pre = pHead;
33         for (int temp : set){
34             if (map.get(temp) == true){
35                 if(isfst){
36                     pHead.val = temp;
37                     isfst = false;
38                 }
39                 else{
40                     pre.next.val = temp;
41                     pre = pre.next;
42                 }
43             }
44
45         }
46         if(isfst) // 链表中只含有重复节点
47             return null;
48         else     // 链表含有不重复的节点
49             pre.next = null;
50         return pHead;
51     }
52 }

【解2】每次找到一个不重复的节点,加入新的链表末尾,最后返回新链表的头指针,时间复杂度O(N),空间复杂度O(1)

 1 import java.util.*;
 2
 3 /*
 4  public class ListNode {
 5     int val;
 6     ListNode next = null;
 7
 8     ListNode(int val) {
 9         this.val = val;
10     }
11 }
12 */
13 public class Solution {
14     public ListNode deleteDuplication(ListNode pHead)
15     {
16         // 解法2:每次找一个不重复的元素,加入链表
17         if(pHead==null)
18             return pHead;
19         ListNode newhead = new ListNode(1);
20         ListNode index = newhead;
21         ListNode p = pHead;
22         boolean rept = false;
23
24         while(p!=null){
25             rept = false;
26             while(p.next!=null && p.val == p.next.val){
27                 rept = true;
28                 p = p.next;
29             }
30             if(rept == false){
31                 index.next = new ListNode(p.val);
32                 index = index.next;
33                 p = p.next;
34             }else{
35                 if(p.next == null){
36                     break;
37                 }else{
38                     p = p.next;
39                 }
40             }
41         }
42
43         return newhead.next;
44     }
45 }

时间: 2024-12-10 21:48:26

刷题--删除链表中重复的节点的相关文章

剑指Offer(链表)-删除链表中重复的节点

(删除链表中重复的节点)题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 解题思路:这里的重复的节点不保留是将只要重复了的节点都要删除掉,所以考虑利用哈希set的方法,先进行重复性的判断,将重复的元素加入到哈希set中去,然后将重复的元素删除. 利用到了两个指针pre和cur,来表示前一个节点和当前节点. /* public

删除链表中重复的节点

因为这个程序快累死老子了,细节处理很麻烦package Solutions; import java.util.ArrayList; /** * Created by hu on 2015/12/12. *//** 删除链表中重复的结点*在一个排序的链表中,存在重复的结点,* 请删除该链表中重复的结点,重复的结点不保留,返回链表头指针.* 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5** */public class solut

剑指offer——面试题18.1:删除链表中重复的节点

1 // 面试题18(二):删除链表中重复的结点 2 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 3 // 结点被删除之后,链表如图3.4(b)所示. 4 5 #include <cstdio> 6 #include "List.h" 7 8 void DeleteDuplication(ListNode** pHead) 9 { 10 if(pHead == nullptr || *pHead == nullptr) 11 retur

剑指offer:删除链表中重复的节点

题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 # Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def deleteDuplicat

58.删除链表中重复的节点

题目描述: ??在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路分析: ??两种思路: ??第一种方法不使用递归,设置一个指针让其指向链表的头结点,我们从头节点开始遍历,要删除重复节点就是判断当前节点的值是否和下一个节点值相等,如果是则往下遍历,直到遇到第一个不相等的节点,新的链表头就从该点开始,然后重复上面的操作找到下一个不重复

【剑指Offer】删除链表中重复的节点

题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 A:当遍历到第一个值为重复的节点时,要有一个指针指向它的前一个节点    因为函数原型没有传二级指针进来,且头结点也有可能被删除,所以要构建一个新结点Head 用布尔型的flag_repeat判断是否有重复节点,若有重复节点则删除,若没有重复节点则移动指针 /* struct Li

[算法]删除链表中重复的节点

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 代码 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } */ public class Solution { public List

29. 删除链表中重复的节点

可能会把头结点删掉的问题,都会定义一个虚拟头节点 p:上一次保留节点的最后一个位置q:下一段的第一个节点,用来把下一段全部扫描结束  ,只要相同q就一直向后走.p到q为一段 本次用来3个节点,一个虚拟节点,另外的p.q用来遍历是否存在重复节点. /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL

题目二:删除链表中重复的节点

public ListNode deleteDuplication(ListNode pHead) { if(pHead==null){ return null; } ListNode preNode = null; ListNode curNode = pHead; while(curNode != null){ ListNode nextNode=curNode.next; boolean needDeleted = false; if(nextNode!=null && curNod