如果遍历两遍链表,很容易就能想到方法,先遍历一边求出链表长度n,遍历第二遍时遍历到n-k位置删除n-k+1个节点
现在是遍历一遍过程也很简单
1.声明两个指针p、q,分别指向链表头结点,让p遍历到第k个节点处
2.若p还没到k处就指向空,则链表长度不够,返回head
3.p、q同时开始遍历链表直到p遍历到链表最后一个节点,这是q到达n-k个节点处,删除到q的下一个节点即可
代码:
Node * deleteN(Node * head, int n) {
if (head == NULL || n <= 0)
return head;
Node * pNode = head->next;
for (int i = 0; i < n; i++) {
if (pNode->next != NULL)
pNode = pNode->next;
else
return head;
}
Node * qNode = head->next;
while (pNode->next)//到达要删除节点的前一个节点
{
pNode = pNode->next;
qNode = qNode->next;
}
Node * temp = qNode->next;
qNode->next = qNode->next->next;
delete temp;
return head;
}
运行结果: