链表操作在面试中经常出现,这一方面考察了对指针的使用,以下整理了一些关于链表的面试题以及注意事项。
首先对单链表进行定义。
struct ListNode{
int val;
ListNode *next;
};
关于链表,有以下几个方面需要注意:
1、指针方面。判断指针是否为NULL,何时判断等等。
2、不要贪图少指针,尽量清楚明了逻辑清晰,多几个指针也没关系。
3、一般单链表的题目较多,一定要注意单链表的单向特性,该保存指针就保存,同2,不要妄想就用一个指针解决问题。
4、指针作为实参传入时要注意,虽然指针可以改变所指向的地址的值,但是指针所保存的地址依然是作为按值传递进入函数的,所以若想使用最后的指针,需要使用指针的指针、引用或者利用函数返回指针,切记这三种方式。
接下来对几个常见问题进行介绍。
问题1:输入一个单向链表,输出该链表中倒数第k个结点
先第一个指针向前走k,然后第二个指针此时和第一个指针一起走即可。
情况:pHead=NULL、链表小于k、k输入为0;
ListNode* LastK(ListNode* pHead, unsigned int k)
{
// 保证输入的正确性;
if (pHead == NULL || k == 0)
return NULL;
ListNode *pAhead = pHead;
ListNode *pBehind = NULL;
f