反转链表
反转一个单链表。
Example
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
思路
我用迭代法做的,定义三个指针p,q,r,p用来标记下一个结点要指向的结点,q用来反转指向p结点,r遍历原序链表,用来保存下一个未反转的结点。
注意开始时p的下一个结点一定要指向空。一开始没有注意这,结果一直超时。原来链表成一个环了,所以一直循环超时。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
if(head == NULL) return head;
if(head->next == NULL) return head;
struct ListNode* p = head;
struct ListNode* q = head->next; //用来反转链表
struct ListNode* r= q; //遍历原序链表
p->next = NULL;
while(q != NULL)
{
r = r->next;
q->next = p;
p = q;
q = r;
}
return p;
}
递归法
递归法我是参照评论区的来写的,感觉好神奇!!
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
if(head == NULL || head->next == NULL) return head;
struct ListNode *re = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return re;
}