类似于leetcode83题,但是比那个难一点。这道题是不保留重复节点,而leetcode83保留。
leetcode链接https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/

leetcode:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        ans = head
        while head != None:
            if head.next != None and head.next.val == head.val:
                head.next = head.next.next
            else:
                head = head.next
        return ans

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

  • 首先要设置两个指针,一个指针pre保持住目前的节点,另一个指针cur顺着这个节点向后搜索,直到遇到有重复的数字。
  • 比如1<2<2<2<3<3<4<5,当cur指向第一个2时,此时pre指向1,进入第三个while循环,通过搜索有三个相同的2,则pre.next = cur = 3
  • 此时退回第二个while循环,由于cur.next还是等于cur(3 == 3),此时又进入循环,最后pre.next = cur = 4(在cur不断移动的过程中pre一直没动,指向1)
  • 再次退回到第二个循环,由于此时cur = 4 不满足循环条件,则退出第二个循环
  • 回到初始的第一个循环中,此时pre指向4,继续进行之前的判断。
  • 考虑到有可能头结点就是重复数字,所以给它设置一个新结点。
class Solution:
    def deleteDuplication(self, pHead):
        # write code here
        newhead = ListNode('a')
        newhead.next = pHead
        pre, cur = None, newhead
        while cur:
            pre = cur
            cur = cur.next
            #判断指针的下一个值是否与当前值相等
            while cur and cur.next and cur.val == cur.next.val:
                t = cur.val
                #和当前值t相等的结点都被抛弃
                while cur and t == cur.val:
                    cur = cur.next
                pre.next = cur
        return newhead.next