问题1:链表反转
问题描述:将原链表反转。
Node* reverseList(Node *head)
{
if (head == NULL)
{
return NULL;
}
Node *oldHead = head;
Node *newHead = NULL;
Node *temp = NULL;
while(oldHead)
{
newHead = oldHead;
oldHead = oldHead->next;
newHead->next = temp;
temp = newHead;
}
return newHead;
}
问题2:找出单链表倒数第k个元素
分析:使用两个指针,这是链表问题典型的方法之一前后指针。
Node* findReK(Node *head, int k)
{
if (head == NULL)
{
return NULL;
}
Node *first = head;
Node *second = head;
int i = 0;
while(first)
{
first = first->next;
++i;
if (i > k-1)
{
second = second->next;
}
}
return second;
}
问题3:找出单链表中间元素
分析:同样使用两个指针,一个快指针一个慢指针,这也是链表问题典型的解决方法之一。
Node* findMid(Node* head)
{
Node *p1, *p2;
if (head == NULL || head->next == NULL)
{
return head;
}
p1 = p2 = head;
while (1)
{
if (p2->next != NULL && p2->next->next != NULL)
{
p2 = p2->next->next;
p1 = p1->next;
}
else
{
break;
}
}
return p1;
}
分析:删除最重要的一点就是要和后面的节点连上,可是我们无法获取被删除前面一个节点。但是被删除前面一个节点的next指向的是被删除节点的内存地址,所以我们把被删除之后的节点的内容复制到被删除节点的内存中就好了,然后删除被删除后面那个节点的内存。
bool deleteNode(Node *node)
{
if (node == NULL)
{
return false;
}
node->data = node->next->data;
Node *temp = node->next;
node->next = node->next->next;
delete temp;
return true;
}