题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
Microsoft面试题
为了正确地反转一个链表,需要调整指针的指向。
a->b->...->h->i->j->...
h、i、j是3个相邻的节点。假设经过若干操作,已经把节点h之前的指针调整完了,这些节点的m_pNext都指向了前面一个节点。
接下来要把i的m_pNext指向h,此时的链表结构如下所示:
a <- b <- ...<- h <- i j->...
由于节点i的m_pNext指向了前一个节点,导致无法在链表中遍历到节点j。
为了避免链表在节点i处断开,需要在调整节点i的m_pNext之前,把结点j保存下来。
在调整节点i的m_pNext指针时,除了要知道节点i本身之外,还需要i的前一个节点h,因此需要
把节点i的m_pNext指向节点h。同时还需要事先保存i的一个节点j,以防止链表断开。
因此需要定义3个指针,分别指向当前遍历到的节点、它的前一个节点以及后一个节点。
最后,尝试找到反转链表的头结点。返回后链表的头结点是原始链表的尾节点,是m_pNext为空的节点。
本题要考虑到一下几点:
1、输入的链表头指针是NULL或整个链表只有一个节点。
2、发转后的链表出现断裂
3、翻转后的头结点是原始链表的尾节点。
扩展,用递归实现链表反转。