题目:
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
为了正确反转一个链表,需要调整链表中指针的方向。
从原链表中挑出连续3个相邻的结点:h->i->j。
如果将i的m_pNext指向h,则变成了h<-i j,这样的话无法在链表中遍历到结点j。
因此我们需要把结点j保存下来。
需要定义3个指针,分别指向当前遍历到的结点、它的前一个结点以及后一个结点。而反转后的链表的头结点,自然是原链表的尾结点,即m_pNext==NULL的结点。
ListNode* ReverseList(ListNode* pHead)
{
ListNode* pReversedHead=NULL;
ListNode* pNode=pHead;
ListNode* pPrev=NULL;
while(pNode!=NULL)
{
ListNode* pNext=pNode->m_pNext;
if(pNext==NULL)
pReverseHead=pNode;
pNode->m_pNext=pPrev;
pPrev=pNode;
pNode=pNext;
}
return pReveresedHead;
}
测试用例:
1、输入链表头指针为NULL
2、输入链表只有一个结点
3、输入链表有多个结点