目录
1. 题目
反转链表
https://leetcode.cn/problems/reverse-linked-list/description/
2. 求解
- 方法一:翻转指针的指向
初始条件:定义三个指针n1,n2,n3分别用指向NULL,第一个数据和第二个数据。
迭代过程:让n2的next指向n1,把n2赋给n1,再把n3赋给n2,再执行n3=n3->next的操作,接下来重复上述操作,直到n2指向空即可。
终止条件:当n2指向NULL时,迭代终止。
注意:要先判断该链表是否为NULL,如果是则返回NULL,此外还要保证当n3为空时就不要动了,直接把n3赋给n2即可。
struct ListNode* reverseList(struct ListNode* head) { //空链表情况 if(head==NULL) { return NULL; } //初始条件 struct ListNode*n1=NULL; struct ListNode*n2=head; struct ListNode*n3=n2->next; //迭代过程,当n2为空时终止循环 while(n2) { n2->next=n1; n1=n2; n2=n3; if(n3) { n3=n3->next; } } //返回n1 return n1; }
- 方法2:头插法
此法就需要再创建一个链表了,创建一个新的头部newhead指向NULL,再定义一个指针cur指向原链表第一个数据,注意还得定义一个指针next指向cur的下一个节点。遍历原链表,把节点取下来头插到newhead所在的链表。每次更新newhead赋给cur。
struct ListNode* reverseList(struct ListNode* head) { if(head==NULL) { return NULL; } struct ListNode*cur=head; struct ListNode*newhead=NULL; while(cur) { struct ListNode*next=cur->next; //头插 cur->next=newhead;//取1指向新头 newhead=cur;//更新头 cur=next;//相后移一个 } return newhead; }