python 链表(2) leetcode 19. 删除链表的倒数第N个节点

在单链表中的删除操作:
在这里插入图片描述
即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
发布了100 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/cy_believ/article/details/104302228