反转链表:
题目链接:
https://leetcode.cn/problems/reverse-linked-list/
解题思路:
想要反转链表,可以再建一个链表,然后赋值进去,但是太麻烦了,如果可以把指针换向,相当于反转链表的效果,那反转指针,就需要使用多指针法来进行。
那需要多少指针呢?
例如上图,把原本从1指向2的指针转换为了从2指向1的指针,那么这就需要有一个指针在2的位置,一个在1的位置,而假如2后面还有元素的话,还需要有一个指针知道这个2后面的结点地址,因此整体看下来,需要三个指针。
1个指针指向结点需要指的地方
1个指针指向需要修改指针域的结点
1个指针需要存储结点的下一个结点,以便于下一次使用
如此,那什么时候结束呢?——当指向结点的指针为NULL时就不需要再进行修改指针了。
这里就用while循环来写。
C语言代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode* p=head;
struct ListNode* q=NULL;
struct ListNode* t;
while(p!=NULL)
{
t=p->next;
p->next=q;
q=p;
p=t;
}
head=q;
return head;
}
方法2:
递归法:
在双指针法中,我们观察到,其实就是不断把cur指针指向pre指针所指的空间,直到cur指针指向为NULL,这其实可以用递归方法实现。
typedef struct Listnode
{
int data;
struct Listnode* next;
}Listnode;
Listnode* reserve(Listnode* pre,Listnode* cur)
{
if (cur == NULL)
{
return pre;
}
Listnode* t = cur->next;
cur->next = pre;
return reserve(t,cur);
}
Listnode* reverseList(Listnode* head) {
// 和双指针法初始化是一样的逻辑
// Listnode* cur = head;
// Listnode* pre = NULL;
return reserve(NULL, head);
}