题目:
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
解题思路:
受双指针思想的启发,我这次使用了三指针思想,最前面的指针负责探路,后面的俩指针完成逆序的变换!
但要注意特殊情况:1.链表为空 2.链表只有一个值 3.链表只有两个值
C语言解答:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode *p,*q,*m;
p=head;
if(head==NULL||p->next==NULL) return head;//链表长度为1时
if(p->next->next==NULL)//链表长度为2时
{
q=p;
p=p->next;
q->next=NULL;
p->next=q;
return p;
}
//链表长度大于或等于3
m=p;
p=p->next;
q=p;
p=p->next;
m->next=NULL;
q->next=m;
while(p->next!=NULL)
{
m=q;
q=p;
p=p->next;
q->next=m;
}
p->next=q;
return p;
}
效率上:比较低效!
下面介绍排行榜上一种效率较高的解答:
双指针,思路和三指针思想差不多,但需引入中间变量指针temp!
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode* p=head;
struct ListNode* New=NULL; //定义一个新链头
if(head==NULL||head->next==NULL)
{
return head; //如果只有一个结点或者为空,则返回head
}
while(p!=NULL) //一直迭代到链尾
{
struct ListNode*temp; //定义一个临时存放批p->next后后面的值得指针变量
temp=p->next; //temp存放p->next的地址
p->next=New; //将p指向New
New=p;
p=temp;
}
return New;
}