类似于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
京公网安备 11010502036488号