题目如下:
阅读题目之后能想到的思路:
1.创建一个新链表,遍历旧链表的所有节点将其头插到新链表上
显然思路1有些麻烦,当然我们还有更便捷的方法---
2.创建3个节点(n1前驱节点,n2当前节点,n2后继节点),分别指向NULL,1,2,让指向1的指针n2“翻转”,使它指向n1的NULL,然后n1指向原来n2所指的1,n2指向原来n3所指的2,n3指向下一个节点。随后重复指向这一操作,直到n2指向NULL。
当然以文字叙述思路二有些难以理解,这里配上图片加以解释:
让指向1的指针n2“翻转”,使它指向n1的NULL:
然后n1指向原来n2所指的1,n2指向原来n3所指的2,n3指向下一个节点(这样的两步就算是一个循环,如此成功的反转了旧链表的第一个节点)
继续循环:
......直到
这时候反转已经完成了,结束的条件就是n2不能为空,且新链表的头结点是n1.
下面是代码的展示,里面有部分步骤的解释:
typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) {
//注意到题目里有提示链表的长度可能为0,故优先考虑head可能为空的情况
if (head == NULL)
return head;
//开始反转,先创建三个指针
ListNode* n1, * n2, * n3;
n1 = NULL, n2 = head, n3 = head->next;
//遍历旧链表
ListNode* pur = head;
while (n2)
{
//修改n2中节点指针的指向
n2->next = n1;
//修改三个指针的位置
n1 = n2;
n2 = n3;
//由于最后一次n3会越界,所以判断一下只有在n3->next不为NULL的时候才移动n3
if (n3)
{
n3 = n3->next;
}
}
return n1;
}
希望我的博客可以帮到你,如果有什么问题或者建议欢迎在评论区讨论,谢谢支持~