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

删除链表中重复的结点

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

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
// 由于链表已经排序,重复值是连在一起的,所以遍历一遍,直接比较即可
// 虽然存在内循环,但是跳跃式的,可以替代原本的外循环,因此时间复杂度为O(n),空间复杂度为O(1)
public class Solution {
    public ListNode deleteDuplication(ListNode pHead) {
    	// 设置两个虚头结点
        ListNode node_1 = new ListNode(-1);
        ListNode node0 = new ListNode(-2);
        ListNode node = pHead;
        node_1.next = node0;
        node0.next = node;
        
        ListNode returnHead = node0; // 由于原来的头结点可能被删掉,需要使用虚头结点的next返回
        int val = -2; // 用于保存重复值
        
        while(node != null){
            if(node.val != node0.val){
                node_1 = node0;
                node0 = node;
                node = node.next;
            }
            else{
                val = node.val;
                // 出现重复时,node前进至不重复点,然后node_1直接跨过重复点连至node
                while(node != null && node.val == val){
                    node = node.next;
                }
                node_1.next = node;
                // 判断是否需要继续遍历,需要则调整node0和node的位置
                if(node != null){
                    node0 = node;
                    node = node.next;
                }
            }
        }
        return returnHead.next;
    }
}
全部评论

相关推荐

01-04 07:53
门头沟学院 C++
心愿便利贴:工作了以后回头再看待这个问题,从客观的视角来讲是因为每个人对自己的要求不同,学习好的人对自己的要求很高,所以觉得考不好就天塌了,认为自己学习好并且值得一份好工作的人也是一样,找不到符合自己预期的工作肯定也会觉得是侮辱,牛客上有很多名校大学生,肯定会存在这种好学生心态啊,“做题区”从来都不是贬义词,这是大部分普通人赖以生存的路径,这个有什么好嘲讽的,有“好学生心态”没有错,但是不要给自己太大的压力了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务