题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。
如何把一个单链表进行反转?
方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。
方法2:使用三个指针遍历单链表,逐个链接点进行反转。
方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。
方法1:浪费空间。
方法2:代码如下,参见http://zhedahht.blog.163.com/blog/static/2541117420073471124487/
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
///
// Reverse a list iteratively
// Input: pHead - the head of the original list
// Output: the head of the reversed head
///
ListNode* ReverseIteratively(ListNode* pHead)
{
ListNode* pReversedHead = NULL;
ListNode* pNode = pHead;
ListNode* pPrev = NULL;
while(pNode != NULL)
{
// get the next node, and save it at pNext
ListNode* pNext = pNode->m_pNext;
// if the next node is null, the currect is the end of original
// list, and it's the head of the reversed list
if(pNext == NULL)
pReversedHead = pNode;
// reverse the linkage between nodes
pNode->m_pNext = pPrev;
// move forward on the the list
pPrev = pNode;
pNode = pNext;
}
return pReversedHead;
}
方法3:代码如下,参见http://www.2cto.com/kf/201110/106607.html
自己写的时候最好画个图
{
p=head->next;
while (p->next!=NULL)
{
q=p->next;
p->next=q->next;
q->next=head->next;
head->next=q;
}
p->next=head; //相当于成环
head=p->next->next; //新的head变为原head的next
p->next->next; //断掉环
return head;
}