Given a linked list, remove the nth node from the end of list and return its head.
For example,
Given linked list: 1->2->3->4->5, and n = 2.
After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:
Given n will always be valid.
Try to do this in one pass.
题目链接
思路
只遍历一遍,这里就想到用两个指针,第一个先走n步,然后再一起遍历,第一个到达尾部的时候,第二个指向的刚好是倒数第n个,然后把它删掉即可。
代码(C)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n)
{
struct ListNode *newhead = (struct ListNode *)malloc(sizeof(struct ListNode));
if (NULL == newhead)
return head;
newhead->next = head;
struct ListNode *fast = newhead;
struct ListNode *pre = NULL;
int i = 0;
while(i < n)
{
fast = fast->next;
i++;
}
pre = newhead;
while(fast->next != NULL)
{
pre = pre->next;
fast = fast->next;
}
pre->next = pre->next->next;
return newhead->next;
}
这里定义一个newhead的原因是:当n等于链表长度时,需要删除头指针,这时候head要被删除。
代码(python)
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
newhead = ListNode(0)
newhead.next = head
fast = head
index = 0
while index < n:
fast = fast.next
index += 1
pre = newhead
while fast:
pre = pre.next
fast = fast.next
pre.next = pre.next.next
return newhead.next