题目
描述
给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针
例如,
给出的链表为: 1→2→3→4→5, n=2.
删除了链表的倒数第 n 个节点之后,链表变为1→2→3→5.
数据范围: 链表长度 0≤n≤1000,链表中任意节点的值满足
0≤val≤100要求:空间复杂度 O(1),时间复杂度 O(n)
备注:题目保证 n 一定是有效的
思路
第一种方法是先走一遍知道链表的长度,然后也就知道了倒数第n个节点是那个节点,再走一遍跳过第n个节点就可以了。第二种是快慢节点,一个先走,当走到第n个节点的时候,另一个也开始走,当先走的走完的时候,后面走的也到了倒数第n+1个节点,然后跳过就可以了。
代码
第一种方法c++版本:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param n int整型
* @return ListNode类
*/
ListNode* removeNthFromEnd(ListNode* head, int n) {
// write code here
int num0 = 0;
int num1 = 0;
ListNode *sg = new ListNode(-1);
sg->next = head;
ListNode *p = sg;
ListNode *r = sg;
while(sg->next){
num0++;
sg = sg->next;
}
while(p->next){
if(num1++ == num0-n){
p->next = p->next->next;
}else{
p = p->next;
}
}
return r->next;
}
};
第二种python版本:
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类
# @param n int整型
# @return ListNode类
#
class Solution:
def removeNthFromEnd(self , head: ListNode, n: int) -> ListNode:
# write code here
slow = ListNode(-1);
slow.next = head
fast = slow
sg = slow
num = 0
while(fast.next):
if(num>=n):
slow = slow.next
fast = fast.next
num += 1
slow.next = slow.next.next
return sg.next
第二种c++版本:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param n int整型
* @return ListNode类
*/
ListNode* removeNthFromEnd(ListNode* head, int n) {
// write code here
ListNode *ph_slow = new ListNode(-1);
ph_slow->next = head;
ListNode *ph_fast = ph_slow;
ListNode *sg = ph_fast;
int num = 0;
while(ph_fast->next){
if(num>=n){
ph_slow = ph_slow->next;
}
ph_fast = ph_fast->next;
num++;
}
ph_slow->next = ph_slow->next->next;
return sg->next;
}
};