题目:
单链表的逆置/反转。
解题思路:
思路一:
定义三个指针,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; }