题目描述:link.
- 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
- 说明:给定的 n 保证是有效的。
- 示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
python代码:
-思路1:先求出链表长度,通过链表长度和n得到删除节点位置,再去删除节点【注意删除节点所处位置:(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, n):
length = 0
li = head
while li: #求链表长度
li = li.next
length += 1
li = head
for i in range(length - n - 1): #找到删除节点的上一个节点
li = li.next
if length == n: #如果删除的为第一个节点
head = head.next
else: #删除中间与结尾节点
li.next = li.next.next
return head
进阶:怎样使用一趟扫描实现?
- 思路2:使用双指针 l i 1 li1 li1 与 l i 2 li2 li2, l i 1 li1 li1 移动 n + 2 n+2 n+2 步后再移动 l i 2 li2 li2 指针,循环一遍后, l i 2 li2 li2 指针会指向需删除节点的上一个节点。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def removeNthFromEnd(self, head, n):
length = 0
li1 = head
li2 = head
while li1:
li1 = li1.next
length += 1
if length > n + 1:
li2 = li2.next
if length == n: #如果删除的为第一个节点
head = head.next
else: #删除中间与结尾节点
li2.next = li2.next.next
return head