赞
踩
其实是知道在链表前面添加一个没有实际存储内容的头结点是有利于程序运行的,但是在实际编程中总是会忘记或者不知道到底起到什么样的作用,或许这就是纸上得来终觉浅,绝知此事要躬行吧。
力扣24题要求我们两两交换链表中的结点。题目链接如下:
在这种情况就很需要有一个头结点,因为考虑到交换两个头结点的时候往往不单单会只用到被交换的两个结点,往往还需要考虑被交换的第一个结点的前一个结点,因为也需要把它的next指针改变。如果设置待被交换的两个结点按顺序分别是cur和next,那么cur前面的结点就是叫pre。
对于pre,cur,next这三个结点,要交换cur和next结点,需要将pre指向next。next指向cur,cur指向next.next,需要用到三个结点。
而如果这个时候不使用头结点的话。
对于第一组要交换的两个结点,和后续组要交换的结点的操作就会不统一。试想一下,当我们处理第一组结点的时候,由于没有头结点,且作为链表头,确实不需要考虑它之前的结点,所以只需要交换cur和next数组,但是这样的处理逻辑在我们处理第二组待交换的结点的时候就会出现问题,因为除了第一组之后的每一组结点都是需要考虑pre结点的。
由于处理第一组结点没有pre结点,而处理后面组的结点需要pre结点,这就造成了处理逻辑的不统一,也就需要我们用一个判断来分开写两段不同的代码进行处理。这不就是会使我们的思考和代码变得很复杂吗?
给定一个链表。head指向第一个结点1。
1->2->3->4
当执行交换1和2结点之后,
- ListNode tmp=head.next;
-
- head.next=head.next.next
-
- tmp.next=head;
链表表现为如下形式:
2->1->3->4
其中head还是指向1,所以在此时如果还是return head;来得到最终想要得到的结果值得话,就会得到一个错误得结果,错误结果为:
1->3->4
从而把2给漏掉了。
所以这个时候head虽然名字是叫头,但是它得实际意义已经不再是指向链表头了,需要找到真正得链表头tmp,它才是最终想要的结果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。