**定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000**
这道题可以通过两个一前一后的指针来实现;先定义一个指针p和head一样指向第一个节点,然后再定义一个指向NULL的指针q位于p的后面,也就是head的前面,让p指向的节点的指针域反过来指向q,p不断向前移动直到走到链表末尾NULL结束,此时的q就是新的头节点;
代码如下:
/**
* 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=p;//如果不设t则p->next指向q后p再无法继续向前移动了
while(p!=NULL)
{
t=t->next;
p->next=q;//将p的指针域反过来指向p之前的q
q=p;//q向前走到p的位置;
p=t;//p向前走到下一个节点的位置
}
return q;
}
代码小改一下:
/**
* 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;
while(p!=NULL)
{
struct ListNode* t=p->next;
p->next=q;
q=p;
p=t;
}
return q;
}
意思都是一样的,看个人理解吧。