剑指offer:面试题16 反转链表
链表节点定义如下:
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *pNext;
}LNode, *LinkList;
1 题意分析:
直接想到头插法建立单链表。
2 思路分析:
a 假设有两条链表L1和L2,L1只有一个节点,即第一个节点,并且置next为空。
b L2指向第二个节点,作为待插入L1中的头节点。
c 遍历L2至表尾,依次在L1头部插入元素。
3 编码实现:
LinkList q16_reverse_list(LinkList& L) {
if (nullptr == L) {
cout << "the list is empty.";
return nullptr;
}
LNode *p = L->pNext;
L->pNext = nullptr;
LNode *q = nullptr;
while (p) {
q = p->pNext;
p->pNext = L;
L = p;
p = q;
}
return L;
}
4 总结:
此题考察链表基本功,没难度,关键是一次写出,准确且快速。