力扣网第206题——反转链表
题目:
反转一个链表
实例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
分析:
第一步:将上一结点present指向NULL,current指向首元结点,next指向正向链表的下一个结点。
第二步:先将当前结点current指向上一结点present,然后将当前结点赋值给上一节点,最后将下一结点与当前结点相连,断开了当前结点与上一结点的连接。然后使下一节点next再后移一次。
第三步:重复第二步的步骤,直至到next结点指向NULL时结束循环,再将最后一个结点current反转指向上一结点。链表反转到此结束。
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
if(!head||!head->next)
return head;
struct ListNode* current;
struct ListNode* next;
struct ListNode* present = malloc(sizeof(struct ListNode));//为链表动态申请内存
present->next=NULL; //将present结点指向NULL
current = head; //将当前结点指向头结点
next = current->next; //将next结点指向当前结点的下一结点
while(current&&next)
{ //如果移动到最后一个结点,则跳出循环
current->next = present->next; //将当前结点指向上一结点
present->next = current; //再将当前结点赋值给上一结点
current = next; //移动当前结点,指向第二个结点,断开与首元结点的链接
next = next->next; //移动下一结点,使其往后移一位置
}
current->next = present->next; //将最后一个结点反转
return current;
}