1、从尾到头打印链表。
输入链表的头节点,从尾到头反过来打印链表每个节点的值。
思路1:顺序遍历链表+stack辅助。
思路2:显式递归实现。每次打印节点,都会递归打印其后的非空节点。
显式递归的缺点:当节点很长时,递归很深,可能会使栈溢出。
2、在O(1)时间删除单链表节点。
给定单链表的头指针和一个节点指针,定义一个函数在0(1)时间删除该节点。
思路1:顺序遍历单链表,找到待删除节点,时间复杂度O(n);
思路2:单链表的特点是,知道前一个Node,通过Node.next才能知道下一个NextNode。
题中已给出了待删除节点Node的地址,那么就知道了待删除节点的NextNode。删除Node,意味着不需要Node.value。
把Node.value=NextNode.value;
Node.next=NextNode.next;
delete(NextNode);
将下一个节点的内容复制到待删除节点,调整待删除节点的next指针,删除下一个节点即可。
Attention:
待删除的是尾节点,必须顺序遍历链表。
是尾节点也是头节点;
不是尾节点可按上诉思路 删除。
3、输出单链表的倒数第K个节点。
思路:定义两个指针Phead 、Pbehind均初始化为头节点;Phead 先从头节点遍历到第K个节点。
随后Phead 与Pbehind同步遍历链表中的节点,直到Phead指向尾节点,此时Pbehind指向的是倒数第K个节点。
ATTENTION!
链表长度小于K,返回NULL;
K=0;返回NULL
4、求链表的中间节点。
思路:定义指针P1、P2,P2的遍历步长是2,P1的遍历步长是1;P1、P2均从头节点开始遍历,直到P2到达尾部。
5、判断单向链表是否形成了环路。
思路:定义指针P1、P2,P2的遍历步长是2,P1的遍历步长是1;P1、P2均从头节点开始遍历。
若P2追上了P1,那么链表就是环形链表。若直到P2到达尾部,都没等于P1,就非环形链表。
6、反转单向链表。
思路:需要定义三个指针,PRE NODE NEXT
7、合并两个已排序的链表。
思路1:已知两个已排序 (递增) 链表的头指针,若合并,选取俩头节点中较小的一个,剩余的链表依旧是俩已排序的链表,因此可以用递归实现。
思路2:循环实现,直到出现NULL指针。
8、寻找两个单向链表的公共节点。
分析:单向链表从第一个公共节点开始,后续节点都是相同的。
思路1:若俩链表有公共节点,那么分别从尾节点逆序遍历,输出的应该是公共节点。可以使用stack的后进先出辅助实现。
假设链表长度分别为m,n, 如此 空间复杂度、时间复杂度都是O(m+n);
思路2:假设链表有公共节点,假设链表长度分别为m,n,且m>n; 那么从较长的链表头部m-n长度的节点肯定不是公共节点,可使用指针Pm先行遍历。
接着Pn从头节点与Pm同步遍历,直到Pm=Pn;
前提是,要分别遍历两链表,计算出diffLen;
2997

被折叠的 条评论
为什么被折叠?



