Leetcode--删除链表节点

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/EngineerHe/article/details/97683825

Leetcode–删除链表中的节点

删除链表中的节点,包括leetcode19和leetcode237

编程语言:python

作者:黑暗主宰

邮箱:[email protected]

Leetcode-删除链表中的节点

题目描述

原题链接:

237. 删除链表中的节点

19. 删除链表的倒数第N个节点

题目描述:

​ 这里题目描述,只把这两个题的题干写出来,具体的,小伙伴们点开链接就可以查看。

237.删除链表中的节点:
  请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
  
19.删除链表的倒数第N个节点:
  给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
  

解题思路

237.删除链表中的节点

一个链表,它不想数组那样可以索引我们指定的元素,所以我们删除链表中节点的方法,一个是修改之前的节点,二是与下一个节点做交换。,如下图所示,是这个两种方法的区别,红色表示要断开的链接,蓝色表示重新指向的地址。

在这里插入图片描述

在leetcode这个删除链表中节点的题目中,我们只知道当前节点,不知道前一个节点,所以我们只能使用第二中方法,代码如下:

class Solution:
    def deleteNode(self, node):
        """
        :type node: ListNode
        :rtype: void Do not return anything, modify node in-place instead.
        """
        node.val = node.next.val
        node.next = node.next.next

正如代码中看到的,只需要两行。第一步操作是把下一个节点的值赋值给当前节点,第二步就是把指向下一个的地址修改为下下一个就可以啦(看图所示)。

19.删除链表的倒数第N个节点

链表不能索引,所以只能从前往后遍历;很自然的一种想法,我们先遍历一遍链表,可以知道他的长度 length,然后我们要删除倒数第 N个,就是从前往后遍历第 length-N个,然后删除节点就可以啦。按照这样的想法,代码如下

在这里插入图片描述

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        if not head:return 
        new = ListNode(0)
        new.next = head
        
        tra = head
        cnt = 0
        while tra:
            cnt += 1
            tra = tra.next
        k = cnt - n
        cur = new
        while  k:
            cur = cur.next
            k -= 1
        cur.next = cur.next.next
        return new.next

上面的方法需要遍历两次,下面提供一种一次遍历的方法,假如我们有两个指针,第一个先走 n步,然后第二个指针开始走,当第一个走完的时候,第二个指针刚好走到了倒数第 n个。如下图:

在这里插入图片描述

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        res = ListNode(0)
        res.next = head
        fast = res
        
        while n:
            fast = fast.next
            n -= 1
        
        slow = res
        while fast and fast.next:
            slow = slow.next
            fast = fast.next
        slow.next = slow.next.next
        return res.next

注: 文中有写错的地方,欢迎大家不吝指正!!!

猜你喜欢

转载自blog.csdn.net/EngineerHe/article/details/97683825