描述
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0≤n≤1000
要求:空间复杂度 O(1),时间复杂度 O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
实现思路
将一个链表进行反转,创建一个新的链表(带头结点),顺序遍历数据链表,采用头插法实现链表的反转。
代码实现
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
*
* @param pHead ListNode类
* @return ListNode类
*/
struct ListNode* ReverseList(struct ListNode* pHead ) {
// write code here
if(pHead==NULL)
return NULL;
struct ListNode *head,*p,*q;
//创建一个带头结点的链表
head=(struct ListNode*)malloc(sizeof(struct ListNode));
head->next=NULL;
p=head;//p指向新的链表
q=pHead;//q指向形参链表
struct ListNode *temp;//创建一个指针用来存放
//头插法插入
while(q!=NULL){
//创建新的指针节点
temp=(struct ListNode*)malloc(sizeof(struct ListNode));
temp->val=q->val;
temp->next=p->next;
p->next=temp;
//指向下一个需要插入的元素
q=q->next;
}
//删除头节点;
head=head->next;
return head;
}