知识点:链表
题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中 重复的结点,重复的结点不保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路:
使用递归法遍历链表。
- 如果链表为空,或只有链表一个节点,返回pHead。
- 如果链表表头的值与表头下一个节点的值相等,则pnode指向pHead.next.next。如果pnode存在,且pnode的值等于pHead的值,pnode指向pnode的下一个节点, 递归 删除pnode。
- 如果链表表头的值与表头下一个节点的值不相等,pHead.next递归。
详解:(递归法)
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteDuplication(self, pHead):
# write code here
if not pHead or not pHead.next:
return pHead
if pHead.val == pHead.next.val:
pnode = pHead.next.next
while pnode and pnode.val==pHead.val: # 当前第一个重复结点为pHead
pnode = pnode.next
return self.deleteDuplication(pnode) # 递归处理剩余结点
else:
pHead.next = self.deleteDuplication(pHead.next)
return pHead
方法二:(指针法)
思路: 构建一个指针,记录当前头节点pHead的上一个节点,当pHead的值与pHead指向的节点的值相同时,遍历链表,直到节点的值不同,将last.next指向pHead(last.next = pHead)。当pHead的值与pHead指向的节点的值不同时,last指向pHead(last = pHead),继续遍历链表(pHead = pHead.next)。
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteDuplication(self, pHead):
# write code here
if not pHead:
return None
#pre指向上一个节点
pre = ListNode(-1)
pre.next = pHead
last = pre
while pHead and pHead.next:
if pHead.val == pHead.next.val:
same = pHead.val
while pHead and same == pHead.val:
pHead = pHead.next
last.next = pHead
else:
last = pHead
pHead = pHead.next
return pre.next
拓展:
问题描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点如果保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->3->4->5
# -*- coding:utf-8 -*-
'''
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
'''
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def deleteDuplication(self, pHead):
# write code here
if not pHead:
return None
lst=[]
first = ListNode(-1)
first.next = pHead
last = first
while pHead and pHead.next:
if pHead.val in lst:
pHead = pHead.next
last.next=pHead
else:
lst.append(pHead.val)
last=pHead
pHead = pHead.next
if pHead.val not in lst:
lst.append(pHead.val)
#return first.next
print(first.next.val)
print(lst)
node1=ListNode(1)
node2=ListNode(2)
node3=ListNode(3)
node4=ListNode(3)
node5=ListNode(4)
node6=ListNode(4)
node7=ListNode(5)
node1.next=node2
node2.next=node3
node3.next=node4
node4.next=node5
node5.next=node6
node6.next=node7
s=Solution()
s.deleteDuplication(node1)
运行结果如下: