类似于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