一. 链表反转类
解决这类问题的关键在于分析指针的变化情况。
1. 反转链表 (leetcode206)
定义新节点pre为新链表的尾部,遍历时将当前结点插入。
2. 成对交换 (leetcode24)
这里和上题类似,只不过是每两个结点进行遍历操作。
i) 更新遍历的节点位置
ii)进行结点移动操作,这里主要是总结出移动后的指向。
3. K个一组翻转链表(leetcode25)
这一题又和上题类似,只不过每次操作变成了k个元素。把握每次遍历时的节点更新操作(newCur和newPre),每次移动的规律(这里是对k个进行移动)
总结规律:
用遍历的方法,只不过每次遍历时操作的节点数不同,需要提前对遍历iterator的更新值进行保存。
在每一次过程中,找出移动的规律或结点指向的变化。
二. 快慢指针类
1. 删除链表的倒数第N个结点(leetcode19)
i) 快指针先定位到N位置,之后快慢指针一起移动(但这里我移动到删除位置的前一个)
ii) 需要分几类情况分别考虑 - 删除表头/表尾/中间结点
2. 环形链表 - 判断链表中是否有环(leetcode141)
快指针每次走2步,慢指针每次走1步,判断是否会相等(或快指针先为空)
3. 环形链表II - 找到环的位置(leetcode142)
这里的分析非常关键,还可以进行拓展(比如计算链表的长度)
4. 旋转链表
这里和删除倒数第N个结点有类似之处。
关键:1)确定好newHead, newTail的位置 —— 采用快慢指针进行定位
2)分情况进行讨论(头/尾/中间位置)
三. 对链表插入、遍历等基本操作
1. 对链表进行插入排序 (No.147)
这一题就是对链表进行遍历,同时保存一个新链表(有序),每次遍历,执行在新链表上的插入操作。
这里也要根据插入的位置分类讨论。
原文:https://www.cnblogs.com/xxwu1999/p/12495208.html