反转链表的2种方法-创新互联
力扣-反转链表
我们提供的服务有:成都网站设计、成都网站建设、外贸网站建设、微信公众号开发、网站优化、网站认证、黄冈ssl等。为成百上千企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的黄冈网站制作公司是在同一个链表,不创建新的链表
最后返回head
思路1:翻转next反转箭头即可,使前一个本应指向下一个的next,指向前一个的前一个
注意: ①改变后找不到下一个,所以提前保存下一个的地址 ②对于当n3指到NULL时,最后一个箭头还未反转:使n2++为NULL,结束
③当head为NULL时,最初创建n3时的head->next直接非法访问综上
struct ListNode* reverseList(struct ListNode* head) {
if (head == NULL)
{
return NULL;
}
struct ListNode* n1 = NULL;
struct ListNode* n2 = head;
struct ListNode* n3 = head->next; //当head==NULL,这里next直接非法访问
//所以开头加入判断
while (n2)
{
// 翻转
n2->next = n1;
// 迭代向后走
n1 = n2;
n2 = n3;
if (n3) // 判断n3是否为NULL,为NULL则不执行
n3 = n3->next;
}
return n1;
}
思路2:头插而在最后一个,和上面思路相同的情况struct ListNode* reverseList2(struct ListNode* head) {
struct ListNode* cur, *next, *newhead;
cur = head; next = head->next; newhead = NULL;
while (cur)
{
// 头插
cur->next = newhead;
newhead = cur;
// 迭代
cur = next;
if (next)
next = next->next;
}
return newhead;
}
这里不需要判断head是否为NULL
因为cur保存head,如果head为NULL,则不会进入cur的循环ps:不建议使用递归,因为递归需要消耗栈,如果节点过多,递归过深,则栈可能撑不住
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
标题名称:反转链表的2种方法-创新互联
当前URL:http://scyanting.com/article/diedes.html