这是一道笔试题:
给你一个指向单链表表头的指针,要你把整个链表反转,并且空间复杂度为O(1),最后返回指向新的链表头的指针。链表节点结构和函数头已给出:
struct LinkNode
{
int data;
LinkNode *next;
};
LinkNode* ReverseLink(LinkNode *head)
{
}
分析:
基础题,空间复杂度O(1)意味着不能复制一个临时链表出来,必须在原链表上直接操作。However,就算题目不要求空间复杂度O(1),我相信也不会有人舍近求远去建立一个临时链表。
代码:
LinkNode* ReverseLink(LinkNode *head)
{
LinkNode *nowHead = head, *sourceLink = head->next, *tempNode = NULL;
while (sourceLink != NULL)
{
tempNode = sourceLink; // 把源链表首节点取出
sourceLink = sourceLink->next; // 源链表首节点后移
tempNode->next = nowHead; // 取出的节点接在目标链表的首部
nowHead = tempNode; // 目标链表首部更改为新的节点
}
head->next = NULL; // 别忘了把原先的链表头指向NULL
return nowHead;
}