在单链表和双链表中删除倒数第K个节点
【题目】
分别实现两个函数,一个可以删除单链表中的倒数第K个节点,另一个可以删除双链表中倒数第K个节点。
【要求】
如果链表长度为K,时间复杂度达到O(N),额外空间复杂度达到O(1)。
C++代码实现:
using namespace std;
#include<iostream>
class Node
{
public:
Node()
{
this->next = nullptr;//这里解决链表的nexx指向未知地址问题
}
int value;
Node* next;
};
class DoubleNode
{
public:
DoubleNode()
{
this->last = nullptr;
this->next = nullptr;
}
int value;
DoubleNode* next;
DoubleNode* last;
};
class Solution_RemoveNode
{
public:
static Node* removeLastKthNode(Node* head,int k)
{
if (head == nullptr || k < 1)
{
return head;
}
Node* cur = head;
while (cur)//写测试用例的时候发现这里会报错,发现在测试用例的最后一个节点如果不手动设值为nullptr的话,是有一个地址的,以我的解决方法就是在node的构造函数中将next设置为nullptr
{
cur = cur->next;
k--;
}
if (k > 0)
{
return head;
}
else if (k == 0)
{
return head->next;
}
else if (k < 0)
{
cur = head;
while (cur)
{
++k;
if (k == 0)
{
cur->next = cur->next->next;
return head;
}
cur = cur->next;
}
}
//对比示例代码之后发现有如下与优化:
/*else if (k < 0)
{
cur = head;
while (++k != 0)
{
cur = cur->next;
}
cur->next = cur->next->next;
return head;
}*/
}
static DoubleNode* removeLastKthDoubleNode(DoubleNode* head,int k)
{
if (head == nullptr || k < 1)
{
return head;//不需要每个分支都做返回,在最后返回就可以了,就是说一般在写函数之前都要想好返回值为哪个变量
}
DoubleNode* cur = head;
while (cur)
{
k--;
cur = cur->next;
}
if (k == 0)
{
head->next->last = nullptr;
return head->next;
}
else if (k > 0)
{
return head;//不需要每个分支都做返回,在最后返回就可以了,就是说一般在写函数之前都要想好返回值为哪个变量
}
else if (k < 0)
{
cur = head;
while (++k!=0)
{
cur = cur->next;
}
cur->next = cur->next->next;
if (cur->next != nullptr)
{
cur->next->last = cur;
}
return head;//不需要每个分支都做返回,在最后返回就可以了,就是说一般在写函数之前都要想好返回值为哪个变量
}
}
};
int main()
{
Node node;
node.value = 1;
node.next = new Node;
node.next->value = 2;
node.next->next = new Node;
node.next->next->value = 3;
node.next->next->next = new Node;
node.next->next->next->value = 4;
Solution_RemoveNode::removeLastKthNode(&node, 2);
DoubleNode doubleNode;
doubleNode.value = 1;
doubleNode.next = new DoubleNode;
doubleNode.next->value = 2;
doubleNode.next->last = &doubleNode;
doubleNode.next->next = new DoubleNode;
doubleNode.next->next->value = 3;
doubleNode.next->next->last = doubleNode.next;
doubleNode.next->next->next = new DoubleNode;
doubleNode.next->next->next->value = 4;
doubleNode.next->next->next->last = doubleNode.next->next;
Solution_RemoveNode::removeLastKthDoubleNode(&doubleNode, 2);
}
这里给出了这道题的C++代码实现,这道题在《程序员面试指南》这本书的链表章节,题目不难,但是作为新手程序员需要编写代码练习一下编程。