206.给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
- 比较简单的一道题,利用双指针法遍历链表,改变每个元素的指向,即可完成反转链表。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
//p用来指向q指向的前一个指针,q用来遍历链表
struct ListNode *p = NULL, *q = head, *temp;
while (q != NULL) {
temp = q->next;
q->next = p;
p = q;
q = temp;
}
return p;
}
- 题解还有一种递归的方法,其实跟第一种做法的逻辑是一样的,只是写法改变了而已,递归的出口仍然是遍历数组的指针到达空元素时结束,返回这个指针指向位置的前一个元素。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverse(struct ListNode* pre, struct ListNode* cur) {
if (cur == NULL)
return pre;
struct ListNode* temp = cur->next;
cur->next = pre;
pre = cur;
return reverse(cur,temp);
}
struct ListNode* reverseList(struct ListNode* head){
return reverse(NULL,head);
}