问题:
假设有一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(非第一个节点, 也非最后一个节点)。请将该节点从单链表中删除。
分析与解法:
若要删除该节点,正常情况下,应该要知道该节点的前面节点的指针,但是由于单链表中没有头结点,所以无法追溯到该节点前面的那个节点,因此,这里采用了“狸猫换太子”的方法。设该节点为B,下一个节点为C。那么,首先将B节点的内容替换为C节点的内容,然后,将C节点删除。
void deleteNode(Node *pCurrent)
{
assert(pCurrent != NULL);
Node *pNext = pCurrent -> next;
if(pNext != NULL)
{
pCurrent -> data = pNext -> data;
pCurrent -> next = pNext -> next;
delete pNext;
}
}
扩展问题:
编写一个函数,给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反过来。
void resverseLinkList(Node *head)
{
Node *pCurrent, *pNext;
pCurrent = head -> next;
while(pCurrent -> next)
{
pNext = pCurrent -> next;
pCurrent -> next = pNext -> next;
pNext -> next = head -> next;
head -> next = pNext;
}
}