剑指Offer-删除链表中的重复结点

89 阅读1分钟

题目

在一个排序的链表中,存在重复的节点,请删除该链表中重复的节点,重复的节点不保留。

数据范围

链表中节点 val 值取值范围 [0,100][0,100]。
链表长度 [0,100][0,100]。

样例1

输入:1->2->3->3->4->4->5

输出:1->2->5

样例2

输入:1->1->1->2->3

输出:2->3

解析

线性扫描,定义一个虚拟头节点dummy,然后扫描整个链表,如果每扫描元素相同一段,若该段元素个数大于1,将整段删除

代码

C++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplication(ListNode* head) {
        auto dummy = new ListNode(-1);
        dummy->next = head;
        
        auto p = dummy;
        while (p->next) {
            auto q = p->next;
            while (q && p->next->val == q->val) q = q->next;
            
            // 下一段长度等于1,下一段不用删掉
            if (p->next->next == q) p = p->next;
            else p->next = q;
        }
        
        return dummy->next;
    }
};

Python

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def deleteDuplication(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        dummy = ListNode(-1)
        dummy.next = head
        
        p = dummy
        
        while p.next:
            q = p.next
            while q and p.next.val == q.val:
                q = q.next
            if p.next.next == q:
                p = p.next
            else:
                p.next = q
        return dummy.next

GO


/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func deleteDuplication(head *ListNode) *ListNode {
	dummy := &ListNode{Next: head}
	p := dummy 
	for p.Next != nil {
	    q := p.Next
	    for q != nil && p.Next.Val == q.Val {
	        q = q.Next
	    }
	    if p.Next.Next == q {
	        p = p.Next
	    } else {
	        p.Next = q
	    }
	}
	return dummy.Next
}