数据结构----力扣刷题
剑指Offer24.反转链表
题目
过题代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
struct ListNode *p;//指向原链表的当前
struct ListNode *s;//指向新建的链表结点
struct ListNode *heads;//指向结果链表的头结点
p = head;//先指向原链表的头节点
if(head == NULL)//特判:当链表头节点为空时,表示该链表中没有数据,为一个空链表,直接返回这个空链表的头节点指针
{
return head;
}
heads = (struct ListNode *)malloc(sizeof(struct ListNode));//建立结果链表的头节点
heads->next = NULL;//使用头插法时,头节点的next域要置为空,因为当结果链表生成后,heads->next将会成为最后一个结点,防止结果链表的最后一个结点的next域指向不知名的内存空间
while(p != NULL)//当 原链表的当前结点不为空时进行循环
{
s = (struct ListNode *)malloc (sizeof(struct ListNode));//申请一个新的链表结点
s->val = p->val;//将原链表的当前结点的值 赋值给 新申请的结点
//printf("%d,",p->val);
s->next = heads->next;//将新申请的结点插入到头节点之后
heads->next = s;//将新申请的结点插入到头节点之后
p=p->next;//指向下一个原链表的结点
}
return heads->next;//注意:要返回结果链表的首结点的指针,即头节点的next域
}
思路:
关键:采用头插法实现反转链表
用一个标记指针p扫描原链表的每一个结点 ----->新申请一个结点s,将p指向的结点值赋值给新结点s ----->将该节点插入结果链表的头节点之后(头插法) ----->返回结果链表的头节点的next域