题目描述:
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0\leq n\leq10000≤n≤1000
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
代码段:
struct ListNode* ReverseList(struct ListNode* pHead ) {
struct ListNode *p = NULL;
struct ListNode *pnew = (struct ListNode*)malloc(sizeof(struct ListNode*));
pnew->next = pHead;
if(pHead == NULL)
return NULL;
p = pHead->next;
while(p) {
pHead->next = pHead->next->next;
p->next = pnew->next;
pnew->next = p;
p = pHead->next;
}
return pnew->next;
}
解题思路:
整体使用头插法对链表进行反转;
初始化阶段:
1、创建一个头指针指向反转链表的第一个节点,可以将它看做一个标志,后面每次插入节点都会插在这个节点的后面(pnew);
2、链表的第一个节点也将是反转完成后的最后一个节点(phead)
3、创建一个索引p,指向每次要操作的节点(p)
操作阶段:
4、由于每次p已经指向了要移动的节点(要移动的节点一定是phead的后一个节点),为了不让链表断掉,先进行pHead->next = pHead->next->next操作;
5、对节点p进行头插操作
6、头插完成后将p指向下一个要操作的节点