输入:1->2->1->4->4->5
输出:1->2->4->5
顺序删除
思路:
1. 采用双重while循环来遍历,遇到重复的就删除
2. 删除操作是用前一个节点pre的指针指向当前节点cur的下一个节点, 即pre.next = cur.next
3. 我们引入三个操作节点的指针outCur, innerCur, innerPre,代表外层当前节点,内层当前节点,内层节点的前一个节点
4. 引入的外部操作指针,需要进行初始化,outCur = head, innerCur = head.next, innerPre = outCur
5. 如果outCur.data == innerCur.data,说明重复,则进行删除操作
6. 操作指针的移动: outCur = outCur.next, pre = innerCur, innerCur = innerCur.next
7. 特殊情况:头节点为空,或者为单节点,直接返回
代码
def removeDup(head):
if head is None or head.next is None:
return head
# 外部操作节点outCur的初始化,头节点作为第一个要遍历的节点
outCur = head
while outCur:
# 内部操作节点innerCur的初始化,第二个节点作为与头节点的比较节点
innerCur = outCur.next
# 由于删除节点时,需要前一个节点指针指向下一个节点,故初始化pre节点,为内部节点innerCur前一个节点outCur
innerPre = outCur
while innerCur:
# 找到重复,前一个节点指针innerPre.next指向下一个节点innerCur.next, 操作指针innerCur移动到下一个节点
if outCur.data == innerCur.data:
innerPre.next = innerCur.next
innerCur = innerCur.next
else:
# 没找到重复,innerCur给innerPre, innerCur移到到下一个节点inner.next
innerPre= innerCur
innerCur = innerCur.next
# 移动w外部操作指针outCur到下一个节点OutCur.next
outCur = outCur.next
return head
# 测试
link = LinkedList()
print("============= before =============")
link.add(1)
link.add(2)
link.add(1)
link.add(4)
link.add(4)
link.add(5)
link.print_link()
print("============= after =============")
removeDup(link.head)
link.print_link()
# 结果
============= before =============
1
2
1
4
4
5
============= after =============
1
2
4
5
评价:双重循环,时间复杂度为O(N),引入的常数个操作节点指针,空间复杂度为O(1)