两次遍历,第一次求链表长度,第二次找到指定节点并删除,贴上python code
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
length = 0
tmp = head
while tmp:
tmp = tmp.next
length += 1
if length <= 1:
return None
delnum = length - n
if delnum == 0:
return head.next
length = 1
tmp = head
while length < delnum:
tmp = tmp.next
length += 1
tmp.next = tmp.next.next
return head
使用快慢指针方法可以实现一次遍历
使p和q指针之前相隔n个节点,当q指针为空时,让p指向p.next.next
若初始化p时,p为空,则说明需要删除的节点是首节点,返回head.next
Java code
public static ListNode removeNthFromEnd(ListNode head, int n) {
ListNode p = head,q = head;
while(n>=0) {
if(q == null)
return head.next;
q = q.next;
n--;
}
while(q != null) {
p = p.next;
q = q.next;
}
p.next = p.next.next;
return head;
}