反转一个单链表。(LeetCode 206)
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
解法一:
思路:把链表里的元素存储到外部的一个数组中,在数组中进行操作,再将数组元素重新放到链表中。
下面是代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//题目创建的链表
struct ListNode* reverseList(struct ListNode* head)
{
int len=0,*a;
int i,j,temp;
struct ListNode *p;
for(p=head;p!=NULL;p=p->next)
len++;//求出链表长度,便于为数组开辟存储空间
a=(int*)malloc(len*sizeof(int));
for(i=0,p=head;i<len;i++,p=p->next)
a[i]=p->val;//将链表的数据存放到数组中
for(i=0,j=len-1;i<=j;i++,j--)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}//反转
for(p=head,i=0;p!=NULL;p=p->next,i++)
p->val=a[i];//将数组元素重新放到链表中
return head;
}
解法二:
思路:要让链表反转,给人最直观的感受是让指向后继节点指针指向前驱节点。并且倒着返回。
下面是代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode *p,*q,*r;
p=NULL;
q=head;
r=NULL;//用于改链时保留后继元素
while(q!=NULL)
{
r=q->next;
q->next=p;
p=q;
q=r;
}
return p;
}