力扣的删除链表的倒数第N个节点解法
题目描述:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
参考程序1:
# 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:
steps = 0
node = head
if not node or not node.next: return None #只有1个节点时也返回None
while steps < n-1 and node:
node = node.next
steps+=1
temp = head
node = node.next # node再走一步
if not node: #如果这时已经到了末尾,说明要删除的是头节点
head = head.next
return head
while node.next:
node = node.next
temp = temp.next
if n == 1:temp.next = None #如果n=1,说明要删除的是尾节点
else: temp.next = temp.next.next
return head
运行结果1:
参考程序2:
# 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:
result = head
length = 0
while result:
length += 1
result = result.next
line1 = ListNode(0)
line1.next = head
result = line1
k = length - n
while k > 0 and result:
result = result.next
k -= 1
result.next = result.next.next
return line1.next
运行结果2:
参考程序3:
# 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:
result = ListNode(-1)
result.next = head
front = result
temp = head
for _ in range(n): #快指针先遍历n个节点
temp = temp.next
while temp is not None: #快指针遍历结束
front = front.next
temp = temp.next
front.next = front.next.next
return result.next
运行结果3: