解法一:遍历
看了其它的一些解法,都是画一排图,搞得很复杂。其实这道题就是不断的删除一个链表的头节点,再将该节点插到另一个链表的头节点之前。
实现步骤:
①初始化一个新链表的头节点pNewHead = NULL;
②旧链表的头节点后移;
③旧链表不要的节点送给新链表;
④重复②
typedef struct{
int data;
LinkNode* next;
}LinkNode;
LinkNode* ReverseLink(LinkNode* pHead)
{
LinkNode *pNewHead=NULL;
LinkNode *pDiscard=NULL;
while(pHead)
{
//旧链表节点后移,丢弃老的头
pDiscard = pHead->next;
pHead = pHead->next;
//新链表接受丢弃节点,作为新的头
pDiscard->next = pNewHead;
pNewHead = pDiscard;
}
return pNewHead;
}
解法二:递归
递归的思路是:
当前节点下一个节点不为NULL,则当前节点保存在栈里,继续处理下一个节点
LinkNode* ReverseLink(LinkNode* pHead)
{
if(!pHead || !pHead->next)
{
return pHead;
}
LinkNode *pNewHead = ReverseLink(pHead->next);
pHead->next->next = pHead;
return pNewHead;
}