BM9 删除链表的倒数第n个节点
给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针
例如,
给出的链表为: 1→2→3→4→5, n= 2
删除了链表的倒数第 n 个节点之后,链表变为1→2→3→5.
数据范围: 链表长度 0≤n≤1000,链表中任意节点的值满足0≤val≤100
要求:空间复杂度 O(1),时间复杂度 O(n)
备注:
题目保证 n 一定是有效的
解法
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param n int整型
* @return ListNode类
*/
typedef struct ListNode* pnode;
static inline struct ListNode* FindKthToTail(struct ListNode* pHead, int k , int *lsize ) {
// write code here
if (!k || !pHead)return NULL;
int i = 1 ;
int j = i;
pnode p = pHead;
pnode q = pHead;
while (q->next) {
j++;
q = q->next;
}
*lsize = j;
if (j < k)return NULL;
i = j - k;
while (i-- > 0) {
p = p->next;
}
return p ;
}
struct ListNode* removeNthFromEnd(struct ListNode* head, int n ) {
// write code here
int lsz=0;
pnode k_n_1 = FindKthToTail(head,n+1,&lsz);
if(k_n_1){
k_n_1->next = k_n_1->next->next;
}else if(lsz==n)
{
head=head->next;
}
return head;
}