题目:
单链表的逆置/反转。
解题思路:
思路一:
定义三个指针,n1,n2,n3,初始值分别为 :链表第一个节点,链表第二个节点,第三个节点。n2保存的是n1的地址,n3保存的是n2的地址,通过n3来往后遍历,直n2为空,这时n1指向最后一个元素,这时返回n1,就可以逆置链表
如下图:
代码实现:
SListNode *reserveNode(SListNode *pFirst)
{
SListNode *n1, *n2, *n3;
if (pFirst== NULL || pFirst->pNext == NULL)
return pFirst;
n1 = pFirst;
n2 = n1->pNext;
n3 = n2->pNext;
while (n2)
{
n2->pNext = n1;
n1 = n2;
n2 = n3;
if (n3)
n3 = n3->pNext;
}
pFirst->pNext=NULL;
pFirst = n1;
return pFirst;
}
思路二:
通过头插法:定义两个指针一个pNewNode指向空,pNode指向链表头,pNode遍历链表,在遍历的时候再定义一个指针来保存pNode遍历的值,然后头插到节点pNewNode上,而不是创一个新链表。
SListNode *reserveNode1(SListNode *pFirst)
{
SListNode *pNewNode = NULL;
SListNode *pNode=pFirst;
while (pNode)
{
SListNode *next = pNode;
pNode = pNode->pNext;
//头插
next->pNext = pNewNode;
pNewNode = next;
}
return pNewNode;
}