给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围:0≤n≤1000
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
//例1:
//输入:
{1,2,3}
//返回值:
{3,2,1}
//============
//例2:
//输入:
{}
//返回值:
{}
//说明:空链表则输出空
/*** struct ListNode {* int val;* struct ListNode *next;* };*//*** @param pHead ListNode类 * @return ListNode类*/
struct ListNode* ReverseList(struct ListNode* pHead )
{//如果只有一个结点 或者 无结点 返回本身if(pHead->next == NULL || pHead == NULL){return pHead;}struct ListNode *p,*q;p = pHead;//q指向最后一个结点 p指向倒数第二个结点while(p){if(p->next->next == NULL){q = p->next;break;}p = p->next;}q->next = NULL;p->next = NULL;//头插法while(pHead){p = pHead;pHead = pHead->next;p->next = q->next;q->next = p; }return q;
}
/*** struct ListNode {* int val;* struct ListNode *next;* };*//*** @param pHead ListNode类 * @return ListNode类*/
struct ListNode* ReverseList(struct ListNode* pHead )
{//若pHead 不存在 在直接返回pHeadif(!pHead) return pHead;//创建一个头结点struct ListNode *L = (struct ListNode*)malloc(sizeof(struct ListNode));L->next = NULL;struct ListNode *p;p = pHead;//头插法while(p){struct ListNode *q = p->next;p->next = L->next;L->next = p;p = q;}return L->next;
}
上一篇:快速排序图解(两种思想)
下一篇:没有美人蛇