Reverse a singly linked list.
click to show more hints.
Hint:
A linked list can be reversed either iteratively or recursively. Could you implement both?
思路:头插法
该方法从一个空表开始,生成新结点,并将读取到的数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头,即头结点之后
struct ListNode* reverseList(struct ListNode* head) {
if (head == NULL) {
return head;
}
struct ListNode* p=head;
struct ListNode* q =head;
while(head->next!=NULL)
{
p=head->next;
head->next=head->next->next;
p->next=q;
q=p;
}
return q;
}
将head作为违反转的部分的指针,q是反转后的指向首个节点的指针,p指向要反转的节点。
思路2:递归
struct ListNode* reverseList(struct ListNode* head) {
//递归终止在最后一个节点
if (head == NULL||head->next==NULL)
{
return head;
}
else
{
struct ListNode* p=reverseList(head->next);//从最后两个开始反转,head指向倒数第二个节点,head->next指向最后一个节点
head->next->next=head;//将最后一个节点的指针域指向前一个节点
head->next=NULL;//将前一个节点断开
return p;
}
}