题目描述
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
使用语言:C语言
思路解析
我最开始想到的方法是,将原链表从末到首每个结点数据依次存储起来,创建一个新链表,再根据存储的数据依次创建结点,最后返回新链表,这么做实在是麻烦,使用下述方法:
- 创建三个指针prev、cur、next,使cur=head,其他两个指针赋空
- 核心思想是让1->NULL,2->1,3->2,4->3,5->4…以此类推,此时就需要使用上一条创建的三个指针和一个while循环,这样就可以直接反转一个单链表了
- 给一个循环while(cur),第一步让next指针等于cur->next(起一个保存下一个结点的作用);然后第二步是让cur指向prev(未反转链表的第一个节点的下个指针指向已反转链表的最后一个节点),因为一开始就给prev赋空了,所以第一个节点是指向NULL;第三步是让三个指针依次都后移一步,操作下一个未反转链表的第一个节点,循环完成后链表就被反转了
- 最后返回的一定是prev,因为进行到最后一个循环后,cur指向NULL,prev指向原链表的最后一个节点,即在反转过后的链表里指向第一个节点,相当于原链表的head指针
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode Node;
struct ListNode* reverseList(struct ListNode* head){
Node* prev = NULL;
Node* cur= head;
Node* next = NULL;
while(cur)
{
next=cur->next;
cur->next=prev;
prev=cur;
cur=next;
}
return prev;
}
运行结果