一、链表移除元素方法介绍
在链表中移除元素,基本思想都是把要移除元素的上一个元素指向要移除元素的下一个元素,如图所示。
但如果在单向链表中,没有指向头节点的指针,则不能直接使用“把待删除的上一个元素指向待删除的下一个元素”这种方法,此时移除元素有两种方法,一种是直接使用原链表移除,另一种是定义虚拟头节点进行移除。
1、直接在原链表中移除
如果直接在原链表中移除,就是直接把原来头节点的指针右移
2、设置虚拟头结点移除
在原链表的头结点前设置一个虚拟头节点,原来虚拟头结点的指针指向原链表的头节点,要删除原链表的头节点,就是把这个虚拟头结点指向原来头结点的下一个节点。
设置虚拟头结点来删除的好处:可以链表统一删除元素的方式,即均采用“待删除的上一个元素指向要删除的下一个元素”的思想。
二、具体实现
两种的整体思想不同,实现的代码也略有差异,但除了头节点,移除的方式都是把要移除元素的前一个元素指向要移除元素的下一个元素。
1、直接移除
直接移除则不使用虚拟头节点
要删除的元素就两种情况:
删除头节点之后的元素
删除头节点
在删除除了头节点以外的元素都是直接把这个元素的上一个元素指向这个元素的下一个元素,即if cur.next.val (指向的是要删除的节点的上一个)==val:cur = cur.next.next(指向要删除节点的下一个)
如果是头节点的话,就直接把头指针右移,即head = head.next。
注意循环是用while而不是if,因为可能出现1,1,1,1的链表,这个链表要删除的target是1的话,就要删除头指针及头指针之外的。
步骤:
定义临时指针cur,初始化cur=head
在指针不为空的情况下,进行移除操作
判断要删除的元素是否为头节点,若为头节点,则向后移动,head=head.next
若要删除的不为头节点且存在,if cur.next.val == val,则将要删除元素的前一个元素指向要删除元素的后一个元素,cur.next = cur.next.next
2、设置虚拟头结点
使用虚拟头结点,删除的方式就统一了,都是直接把要删除的元素的上一个节点指向要删除元素的下一个结点。
步骤:
1.定义一个虚拟头结点dummy_head,指向头结点,初始化即dummy_head.next=head
2.使用while循环,当指针不为空时,进行移除操作
如果找到了要删除的节点,直接把这个节点的上一个指针指向这个节点的下一个元素,if cur.next.val == val : cur.next = cur.next.next
否则把临时指针下移,cur = cur.next。
代码