题解 | #删除链表中重复的结点#

删除链表中重复的结点

http://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef

暴力解法,可以用HashSet记录重复的元素,一个一个删除,但是要遍历链表两次,O(N),O(N)

O(N), O(1)

链表题目,最好都加一虚拟头结点,有利用统一操作,不需要分开单独处理头结点

只需要一次遍历的时候,如果cur,cur.next指针的元素值相等,就一直向后移动cur指针,直到cur指针和此重复值不相等,结束,然后可以一起删除这些重复值(此时pre和cur指针中间的值)

如果cur,cur.next指针的元素值不相等,pre和cur都向后移动一次即可

因为有虚拟头结点的缘故,所以最后要去掉此虚拟结点,即返回dummy.next

import java.util.*;
public class Solution {
public ListNode deleteDuplication(ListNode pHead) {
    ListNode dummy = new ListNode(0);
    dummy.next = pHead;
    
    ListNode pre = dummy;
    ListNode cur = pHead;
    
    while(cur != null && cur.next != null){
        if(cur.val == cur.next.val){
            int val = cur.val;
            cur = cur.next;//此操作可有可无,有的话,少循环一次.也可以cur = cur.next.next;
            while(cur != null && cur.val == val){//向后移动cur
                cur = cur.next;
            }
            pre.next = cur;//mark,删除操作;
        }else{
            pre = cur;
            cur = cur.next;
        }
    }
    
    return dummy.next;
}
}
全部评论

相关推荐

点赞 评论 收藏
分享
把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
头像
11-27 14:28
长沙理工大学
刷算法真的是提升代码能力最快的方法吗? 刷算法真的是提升代码能力最快的方法吗?
牛牛不会牛泪:看你想提升什么,代码能力太宽泛了,是想提升算法能力还是工程能力? 工程能力做项目找实习,算法也分数据结构算法题和深度学习之类算法
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务