链表的一些问题经常会在面试中出现,这类题目能很好的反映出程序员的编程基本功,以及思维的缜密程度。写代码之前,最好能仔细分析一下题目,列出关键点。其实思路是最重要的,思路如果正确,代码实现不是问题,更像是一个翻译的过程。下面是4道关于链表的题目,网上都有思路解答。自己实现了一下,供网友参考。下面各题的链表结点定义如下:
struct ListNode
{
int key;
ListNode *next;
ListNode(int k = 0, ListNode *p = NULL) { key = k; next = p;}
};
问题1:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。
思路:可以定义两个辅助指针,一个指向当前结点,设为pCur;一个指向前一个结点,设为pPrev,然后反转 pCur->next = pPrev。但是原来的pCur->next丢失了。可以再定义一个辅助指针pNext,用来保存这个值。另外就是一些为空的判断,需要加倍小心。
参考代码:
ListNode* ReverseList(ListNode *pHead)
{
ListNode *pPre = NULL;
ListNode *pCur = pHead;
//开始反转
while(pCur != NULL)
{
ListNode *pNext = pCur->next; //临时保存下一个结点
//关键的三步
pCur->next = pPre; //反转
pPre = pCur; //保存上一个结点
pCur = pNext; //更新当前结点
}
return pPre; //pPre变为第一个结点
}
问题2: