链表面试题总结
1.删除所有val值:遍历一遍,每个结点的值和val进行比较。
2.反转(逆置)链表:方法1:三个指针逆置
方法2:尾删,头插
3.求链表的中间结点: 设置快慢指针,快的每次走俩步,慢的每次走一步。
4.输出倒数第k个结点:设置俩个指针,第一个先走K步,然后俩个指针同时走,第一个指针走到空,第
二个指针的位置就是倒数第K个结点。
5.合并俩个有序链表:拿几个指针一直比较,小的进行尾插,指针同时一直移动。
cur1 cur2 pTail Newhead
6.依据x,分割链表:5个指针,lt lt_tail ge ge_tail cur,小于x的lt链表,大于等于ge链表,lt_tail,ge_tail
负责移动,插入cur遍历
7.删除重复结点:利用prev保存相同结点之前的最后一个结点(用于删除),p1 p2在相同结点移动
result保存头结点。先删除,再重新拼接链表。
8.链表是否回文:利用快慢指针找到中间结点K,再从中间结点k的下一个结点开始逆置链表。然后设置
双指针开始遍历俩个链表,进行比较。
9.输入俩个链表,找出它们第一个公共结点:分别求出链表的长度,求出长度差n,再定义俩个指针,让
长的链表先走n步,然后俩个链表同时走,结点相同时返回结点。
10.给定一个链表,判断链表中是否有环:设置快慢指针,快的走俩步,慢的走一步,相交就有环。
11.给定一个链表,返回链表开始入环的第一个结点,如果没有环就返回空:
设置快慢指针,若有环,必相遇。在相遇点处,慢指针单步走,设置新的指针在头
结点处,同时单步走,俩指针必在入环出相遇。