目录
题目
给出一个单链表头节点,请你返回该链表反转后的新头节点;
例如:
处理前链表状态: a-> b-> c-> d-> e->f;
提供a地址;
处理完后链表状态:f-> e-> d-> c-> b-> a;
返回f的地址;
做法1:利用两个动态指针反转箭头
利用两个动态指针,逐个反转节点
先定义两个指针:
node *pre=NULL;
node *cur=head;
因为最后的状态是头节点在链表末尾,所以在反转时,头节点前应该指向NULL;
状态1如下:
进行操作如下:
①将cur节点next指向pre节点
②再让pre指针指向cur节点
③cur指针往前走一步
//在③之前,cur节点的next指针已经改变,所以要创建一个临时指针,在cur节点next指针改变前要保存cur节点的下一位节点。
重复①②③操作n次,即遍历n个节点,逐个反转。
当cur指向NULL时,说明当前已经反转完了所有节点。
函数代码:
//函数只返回头节点地址
//调用方式list=reversal(list);
node* reversal(node* head){
node *pre=NULL;//保存前结点的指针
node *cur=head;//当前修改位置的指针
while(cur){
node* temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
return pre;
}
做法2:头插法
创建一个新头节点,将链表头节点断开再从新链表头位置插入;类似队列
定义一个指针指向新链表的头节点,刚开始为空;
再定义一个指针,操作当前节点,刚开始指向链表头节点;
node *head_new=NULL;
node *cur=head;
初始状态如下:接着
①cur节点的next指针指向head_new节点
②更新head_new,即更新头节点指针
③cur继续走一步
//在③之前,cur节点的next指针已经改变,所以要创建一个临时指针,在cur节点next指针改变前要保存cur节点的下一位节点。
进行完一次①②③操作后的状态如下:
进行完两次①②③操作后的状态如下:
执行n次①②③操作,即将n个节点逐次插入到新链表
当cur指向NULL时,说明当前已经插入完了所有节点。
函数代码:
//函数只返回头节点地址
//调用方式list=reversal(list);
node* reversal(node* head){
node* head_new=NULL;
node* cur=head;
while(cur){
node *temp=cur->next;//保存cur的下一节点
cur->next=head_new;//从新链表头节点前插入节点
head_new=cur;//更新新链表的头节点
cur=temp;//cur向前走一步
}
return head_new;
}
ps:
练习这道题目,便于熟悉链表操作的规则,更帮助理解链表结构。