c加加语言链表的交换,面试题目:反转链表的算法实现

链表通常有单链表,双链表和循环链表,是面试里面常涉及到的考点。链表的结构简单,但是涉及到指针的操作,容易出现新的理解,其中也牵涉到许多小的细节的考虑。

面试题:反转链表

题目描述:定义一个函数,输入一个链表的头结点,求反转后该链表的输出和链表的头结点。

链表结点定义如下:

1 struct ListNode {

2 int val;

3 struct ListNode *next;

4 ListNode(int x) :

5 val(x), next(NULL) { //构造函数

6 }

7 };

分析:

链表前后元素的关联就是通过指针实现的,每个链表都有一个next指针指向下一个结点,末尾的节点的next域则置NULL;

反转链表就是要求修改指针的指向。下面的图就是反转前和反转后的效果。

反转前:

81f81095536f0a6e3f01bdafc9912a55.png

反转后:

7ea830027ae50da26d07e33c9452b354.png

下面来实现如何对链表进行反转。

假设我们现在正在对结点3进行反转操作,即原来结点2的next域指向j结点3(图中已经调整完毕,现在指向前一个结点),结点3的next域指向结点4。现在要做的是将结点3的next域指向结点2。从图中我们可以看出,当把结点3的next指针指向结点2的同时,原先指向的4就已经无法被正常的访问到了,为了避免“断链”,我们必须在指针更改指向之前,保存修改结点的下一结点。同时我们也必须存储上一个结点,因为next域即将修改指向该结点。因此定义三个指针,分别指向当前遍历的结点,前一个结点和后一个结点。

算法实现如下:

1 ListNode* ReverseList(ListNode* pHead)

2 {

3 ListNode* pReversedHead = NULL;

4 ListNode* pNode = pHead;

5 ListNode* pPrev = NULL;

6 while(pNode != NULL)

7 {

8 ListNode* pNext = pNode->next;

9

10 if(pNext == NULL)

11 pReversedHead = pNode;

12

13 pNode->next = pPrev;

14

15 pPrev = pNode;

16 pNode = pNext;

17 }

18

19 return pReversedHead;

20 }

当然使用下面这样想法也是可以的,两者的思路一致,没有差别。只不过下面的代码必须注意一点,跳出while循环的时候,最后一个结点的next域指向前一个结点,否则就会导致“断链”。

1 ListNode* ReverseList(ListNode* pHead) {

2 ListNode *base=pHead;

3 ListNode *pre=NULL;

4 ListNode *pnext=NULL;

5 if(pHead==NULL) return NULL;

6 while(base->next){

7 pnext=base->next;

8 base->next=pre;

9 pre=base;

10 base=pnext;

11 }

12 base->next=pre;

13 return base;

14 }

1、资源项源码均已通过严格测试验证,保证能够正常运行; 2、项问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项仅用作交流学习参考,请切勿用于商业用途。1、资源项源码均已通过严格测试验证,保证能够正常运行; 2、项问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项仅用作交流学习参考,请切勿用于商业用途。1、资源项源码均已通过严格测试验证,保证能够正常运行; 2、项问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项仅用作交流学习参考,请切勿用于商业用途。1、资源项源码均已通过严格测试验证,保证能够正常运行; 2、项问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项仅用作交流学习参考,请切勿用于商业用途。1、资源项源码均已通过严格测试验证,保证能够正常运行; 2、项问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项仅用作交流学习参考,请切勿用于商业用途。1、资源项源码均已通过严格测试验证,保证能够正常运行; 2、项问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项仅用作交流学习参考,请切勿用于商业用途。1、资源项源码均已通过严格测试验证,保证能够正常运行; 2、项问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项仅用作交流学习参考,请切勿用于商业用途。
1、资源项源码均已通过严格测试验证,保证能够正常运行; 2、项问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项仅用作交流学习参考,请切勿用于商业用途。1、资源项源码均已通过严格测试验证,保证能够正常运行; 2、项问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项仅用作交流学习参考,请切勿用于商业用途。1、资源项源码均已通过严格测试验证,保证能够正常运行; 2、项问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项仅用作交流学习参考,请切勿用于商业用途。1、资源项源码均已通过严格测试验证,保证能够正常运行; 2、项问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项仅用作交流学习参考,请切勿用于商业用途。1、资源项源码均已通过严格测试验证,保证能够正常运行; 2、项问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项仅用作交流学习参考,请切勿用于商业用途。1、资源项源码均已通过严格测试验证,保证能够正常运行; 2、项问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项仅用作交流学习参考,请切勿用于商业用途。1、资源项源码均已通过严格测试验证,保证能够正常运行; 2、项问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值