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

删除链表中重复的结点

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

多年不刷题 刷了链表的几个 这居然是第一个一遍ac的 绝了

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

    ListNode(int val) {
        this.val = val;
    }
}
*/

// 该问题其实就是删除链表中节点的问题 首先知道需要删除哪些节点 其次特殊处理首节点被删除的情况即可
// 需要三个指针 其中一个 首节点可能被删除 需要一个头指针记录处理
// 1->1->1
// 1->1->1->2
// 1->1->1->2->2->3->4
// 1->2->2->3->4->4->5
import java.util.HashSet;
public class Solution {
    public ListNode deleteDuplication(ListNode pHead) {
    	// 求出重复的节点
    	HashSet<Integer> all = new HashSet<>();
    	HashSet<Integer> ansSet = new HashSet<>();
    	ListNode tmp = pHead;
    	while(tmp != null) {
    		if (!all.add(tmp.val)) {
    			ansSet.add(tmp.val);
    		}
            tmp = tmp.next;
    	}

    	// 很多问题需要设置 头指针 特殊处理首节点
    	ListNode head = new ListNode(-1);
    	head.next = pHead;

    	// 删除链表的节点 p q 
    	ListNode p = head;
    	ListNode q = pHead;

    	while (q != null) {
    		// q节点需要被删除
    		if (ansSet.contains(q.val)) {
    			// 删除q节点
    			p.next = q.next;
    			// 注意:如果是头节点指向的节点***掉 需要更新头节点 以记录当前链表的首节点在哪里
    			if (head.next == q) {
    				head.next = q.next;
    			}
    			// q移动 但p不动!
    			q = q.next;
    		} else {
    			// q节点不需要被删除 p q同时移动!
    			p = q;
    			q = q.next;
    		}
    	}

    	return head.next;
    }
}
全部评论

相关推荐

野猪不是猪🐗:现在的环境就是这样,供远大于求。 以前卡学历,现在最高学历不够卡了,还要卡第一学历。 还是不够筛,于是还要求得有实习、不能有gap等等... 可能这个岗位总共就一个hc,筛到最后还是有十几个人满足这些要求。他们都非常优秀,各方面都很棒。 那没办法了,看那个顺眼选哪个呗。 很残酷,也很现实
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务