线性表-链表

一、链表

链表的题目一般不难,主要考查coding能力。

1.链表相加

给定2个链表,分别表示2个非负整数。它们的数字逆序存储在链表中,且每个结点只存储一个数字。计算这两个数的和,并返回和的链表头指针。

【分析】leetcode第2题。

逆序存储的好处是,可以从头指针开始,逐位计算当前位和进位,依次放入表示和的链表中。

【扩展思路】上述逆序链表这个结构其实非常巧妙,还可以用来实现大数运算。(我以前都是用数组做=,=,数组的好处是可以随机访问,做乘法方便定位,,但链表做乘法嘛……呃,需要多用辅助指针……)

【我的代码:4ms】

image

2. 链表翻转

给定一个链表,翻转该链表第m到第n个位置。要求直接翻转而非申请新空间。如,给定1,2,3,4,5,m=2, n=4, 返回1,4,3,2,5。

【分析】leetcode 第92题。

一般使用头插法,把后面的结点依次插入头结点前面,注意是依次。这样,只需要一个指针记录参考结点,一个指针遍历待翻转结点,一个计数器。

【我的代码】0ms

image

3.链表去重

给定排序的链表,删除重复元素,只保留第一次出现的结点。

【分析】leetcode第83题。

很简单,因为链表已经有序了,直接删除后面相同的元素即可。

【我的代码】1ms。

image

4. 链表划分

给定一个链表和一个值x,将链表划分为两部分,使得小于x的结点在前,大于等于x的结点在后。在这两部分中要保持原链表中的出现顺序。

【分析】leetcode第86题。

有点类似于快排中的partition过程。但注意到链表的特殊结构,可以直接申请2个指针,把小于x的结点都插入第一个指针后面,大于等于x的结点都插入第2个指针后面,最后再把这2个链表接起来就可以了。时间复杂度为n,空间为2.

【思路扩展】快速排序也可以用单链表结构存储。但注意不是所有排序都适合单链表结构,比如堆排序就不适合。

【我的代码】1ms。

image

5.单链公共结点问题

给定2个单向链表,计算两个链表的第一个公共结点。若没有公共结点,返回空。

【分析】leetcode第160题。

注意是单向链表,所以在公共结点之后的所有结点是相同的,不可能出现x形结构。因此,可以先遍历2个链表,得到长度m,n。然后长链表先走|m-n|步,然后同步走,直到指向同一个结点。

【思路扩展】如果是链表中存在环,则需要用快慢指针的方式计算公共结点。即2个指针,每次分别移动1步或2步。

【我的代码】2ms。

image

流年素心 http://www.cnblogs.com/lddbupt/
原文地址:https://www.cnblogs.com/lddbupt/p/5477149.html