《编程之美》3.4从无头单链表中删除节点
假设有一个没有头指针的单链表,一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
作者巧妙地把删除无头单链表节点的问题做了转换,把要删除的节点的下一个节点中的数据部分传递给此节点,然后再删除下一个节点。可见,在不影响效率和复杂度的前提下,我们完全可以不受题目要求的局限,另辟蹊径。
扩展问题是面试的常见问题:编写一个函数,给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反转过来。
问题的关键是对链表头和尾指针的处理,头指针的next需要=NULL,尾指针的next指向它之前的一个。下面是实现代码:
Node* Reverse(Node* head)
{
Node *p, *q;
if(head == NULL)
return NULL;
p = NULL; /* 反转后头指针的next为NULL */
while(head->next)
{
q = head->next; /* 保存指针的下一个 */
head->next = p; /* next指针反转 */
p = head; /* 指针后移 */
head = q; /* 指针后移 */
}
head->next = p; /* 尾指针的next为它前一个 */
return head;
}