作者:小 琛
欢迎转载,请标明出处
题目:
思路一:
要翻转链表,我们可以翻转其指针的指向。
而要实现该操作,我们则需要三个指针,其中两个用来翻转,第三个用来保存下一个的地址
我们要进行的操作:
1、n1的初值为头,n2为头的next,n3为n2的next,以n2是否为空作为循环判断条件
2、在进入循环前将n1的next置为空,即n1作为尾
3、每次循环的操作为:n2的next置为n1,n1=n2,n2=n3,n3=n3->next
注意当进行最后两个时,n3为空,那么会出现空指针的访问,因此需要在该语句加判断
即:
代码:
PlistNode* reverseList1(PlistNode** head)
{
if ((*head == NULL) || ((*head)->_next == NULL))
return *head;
PlistNode* n1 = (*head);
PlistNode* n2 = (*head)->_next;
PlistNode* n3 = n2->_next;
n1->_next = NULL;
while (n2 != NULL)
{
n2->_next = n1;
n1 = n2;
n2 = n3;
if (n3 != NULL)//要考虑最后两个的情况
n3 = n3->_next;
}
return n1;
}
思路二:
头插法。动态开辟空间,利用一个临时量cur遍历原链表一遍,将原链表的每一个值头插到一个新的链表上
代码:
PlistNode* reverseList(PlistNode** head)
{
if ((*head) == NULL || (*head)->_next == NULL)
return (*head);
PlistNode* cur = *head;
PlistNode* newhead = GetNode(cur->_date);
PlistNode* tmp = NULL;
while (cur->_next != NULL)
{
cur = cur->_next;
tmp = GetNode(cur->_date);
tmp->_next = newhead;
newhead = tmp;
}
return newhead;
}
感谢浏览