描述
题目要求:
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0≤n≤10000≤n≤1000
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
代码(C)
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
struct ListNode* ReverseList(struct ListNode* head ) {
// write code here
struct ListNode* p1;
struct ListNode* p2;
struct ListNode* p3;
p1 = head; //now
p2 = NULL; //next
p3 = NULL; //last
//将链表反向的关键是next指向上一个
//原头节点下一个改为NULL 原末节点下一个改为原末节点的上一个
while(p1 != NULL) //注意这里的p1是一个地址 只要地址存在就说明这不是末节点
{
p2 = p1->next; //先拿到下一个列表 更改的节点只能是当前节点的内容
p1->next = p3;
p3 = p1;
p1 = p2;
}
return p3; //这里提交的是当前的节点 while循环当碰到next为null的时候结束
}
总结
1.逻辑很重要 每次修改的内容是当前节点
2.在修改完后要将当前节点变为下一个节点
3.为了链接上一个节点上一次循环需要将当前节点(上一次循环中)保留下来
4.链表的关键就是当前节点、上一个节点、下一个节点这三个变量要定义好
5.注意头末节点的特殊处理
361

被折叠的 条评论
为什么被折叠?



