三指针法
思路:
- 先定义三个指针q,p,r。p=head->next,q保存后继点。
- 将第一个结点变为尾节点。p->next = NULL;
- 使用while循环,条件为q(即q!=NULL)。 r = q; q = r->next; //保存后继点
r->next = p; //改变指针指向
p = r; //指针后移
- 连接头节点。head=r。 代码:
void Reverse(LinkList head)
{
Node *p, *q, *r=NULL;
p = head->next;
q = p->next;
p->next = NULL;
while (q)
{
r = q;
q = r->next;
r->next = p;
p = r;
}
head->next = r;
}
递归法
思路:
- 函数需要两个形参,一个传递头指针,一个传递后继点void Reverse(LinkList head, Node *p)。
- 结束条件(p == NULL || p->next == NULL),移到最后一个节点结束递归并连接头结点head->next = p。
- Node *pNext =p->next; //pNext保存后继点
Reverse(head, pNext); //递归调用
pNext->next = p; //改变指针指向
p->next = NULL; //令尾结点的指针域为空
void Reverse(LinkList head, Node *p)
{
if (p==NULL || p->next==NULL)
head->next = p;
else
{
Node *pNext =p->next;
Reverse(head, pNext);
pNext->next = p;
p->next = NULL;
}
}
头插法
思路:
- 先定义两个指针p,q。
- p指向首元结点p=head->next,将原链表置为空表head->next=NULL。
- 用while循环,条件为p。 q = p->next; //保存后继点
p->next = head->next;
head->next = p; //取出结点,作为第一个结点插入到新表中
p = q; //结点后移
void Reverse(LinkList head)
{
Node *p, *q;
p = head->next;
head->next = NULL;
while (p)
{
q = p->next;
p->next = head->next;
head->next = p;
p = q;
}
}