总结:
今日共完成3题,总用时2h10mins。整体效率较高,对于链表结构的理解有所加深。
206.反转链表
自己的想法:
使用头插法,依次遍历原链表,遇到值就摘下来移到新的链表中。
正确的做法:双指针法
直接在原基础上直接实现反转,如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。
反转时不用添加或删除节点,而是直接改变next指针的方向。
24. 两两交换链表中的节点
自己的想法:
定义一个双指针,cur指向头结点,cur->next指向与其相邻的结点,通过tmp指针交换val的值之后,统一向后挪动。
出错了❌,要注意的点:
在做的时候没考虑到结点的移动。
直接交换的就是结点的值,而没有改变结点之间的关系。
正确的做法:
设置虚拟头结点。
ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
dummyHead->next = head; // 将虚拟头结点指向head,这样方便后面做删除操作
只有找到要改变的结点的前驱节点,才能改变结点当下的走向。
要操作的指针要指向 要反转的两个结点 的 前一个指针。
注意:
1.明确遍历终止的条件,为奇数/偶数时有不同的终止方式。
2.画图明确要交换的逻辑,设立临时指针来表示可能被交换的变化的指针的值。
19.删除链表的倒数第N个节点
自己的想法:
设立两个指针,原先在同一起跑线。然后让一个指针先运动n个单位,接着两个指针一起运动直到靠后的那个指针指向NULL,此时前方指针的位置正好是倒数第n个位置的位置点。
想法正确√