在单链表中的删除操作:
即p->next = p->next->next;或者q = p->next,p->next = q->next;
python代码如下:
def remove(head,item):
"""删除节点"""
cur = head
finish_head = head
pre = None
n = 0
while cur is not None:
n += 1
if n == item:
# 找到指定元素
# if cur.item == item:
# 如果第一个就是删除的节点
if not pre:
# 将头指针指向头节点的后一个节点
head = cur.next
else:
# 将删除位置前一个节点的next指向删除位置的后一个节点
pre.next = cur.next
return head
else:
# 继续按链表后移节点
pre = cur
cur = cur.next
获取链表长度
def length(head):
"""链表长度"""
# 初始指针指向head
cur = head
count = 0
# 指针指向None 表示到达尾部
while cur is not None:
count += 1
# 指针下移
cur = cur.next
return count
题目:
题解一:
单次遍历,设置两个指针。一个指针快,一个指针慢。快指针首先走n+1个节点,然后停下;紧接着,慢指针开始走,这时候快指针也同步进行走;因此,快指针指是第n+2个节点时,慢指针为第一个节点;但是快指针最后走到null节点;这时候慢指针到终端节点一共n+1个节点。
根据这个思路即可写出下述代码:
class Solution:
def removeNthFromEnd(self, head, n):
a = ListNode(0)
a.next = head #设置一个头结点
first = a
second = a
for i in range(1,n + 2):
first = first.next
while(first != None):
first = first.next
second = second.next
second.next = second.next.next
return a.next
题解二:
先进行一次获取链表的长度L;然后正向删除第L-n+1个节点即可;设置一个头节点,方便进行删除。
代码如下:
class Solution:
def removeNthFromEnd(self, head, n):
a1 = ListNode(0)
a1.next = head#设置一个头节点,用来删除的方便
first = a1
second = a1
length = -1
#计算链表的长度
while(first != None):
first = first.next
length += 1
#删除第L-n+1个节点
for i in range(1,length - n + 1):
second = second.next
second.next = second.next.next
return a1.next