先定义链表节点:
struct Node
{
int key;
Node *next;
};
创建链表:
void Create(Node **head)
{
*head = new Node;
Node *p,*q = *head;
for(int i = 0 ; i < 10 ; i++)
{
p = new Node;
p->key = i;
if(i == 0)
*head = p;
q->next = p;
q = p;
}
q->next = NULL;
}
打印链表:
void Print(Node *head)
{
Node *p = head;
while(p)
{
cout << p->key << " ";
p = p->next;
}
cout << endl;
}
下面进入正题,逆置链表!
逆置链表有递归跟非递归两种实现算法,递归算法:
Node *Reverse1(Node **head,Node *t)
{
Node *p = t;
Node *q = p;
if(p->next == NULL)
{
(*head)->next = NULL;
*head = p;
return p;
}
p = p->next;
Reverse1(head,p)->next = q;
return q;
}
递归算法只要明白了含义,还是很容易理解的,其实就是不断地向后移动,直到链尾,然后将其返回,此时,当前指针是q,要逆置,就得将q的前一个(也就是返回的指针)节点的next设为q,以此类推。
非递归算法:
void Reverse2(Node **head)
{
Node *pre,*cur,*next;
if(*head == NULL || (*head)->next == NULL)
{
return ;
}
pre = *head;
cur = (*head)->next;
while(cur != NULL)
{
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
(*head)->next = NULL;
*head = pre;
}
相比与递归算法,非递归算法的意思就更加直接了,假设我们有前、中、后三个指针,初始顺序为前->中->后-,只要遍历一次链表,将中的下一个指向前(中->前),然后前移动到中,中移动到后,直到链尾就结束。