一、链表是什么?
1.链表是一种存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现的。
2.链表包括了两部分:
(1)存储数据
(2)指向下一个节点的指针
二、链表的作用
因为链表的特殊结构,元素与元素之间的插入和删除时间复杂度为O(1)。
比如图中,想要删除元素2,只需将元素1的next指针直接指向3,并断开元素2指向元素3的next指针即可。
同样,如果需要在元素1和元素2之间插入一个新元素,只需要断开元素1和元素2之间的next指针,将元素1的next指针指向元素4,并将元素4的next指针指向元素2即可。
而链表的访问与搜索的时间复杂度则为O(n),比如一串链表中元素分别为1、2、3,若想要访问元素3,则需要先从头节点,也就是元素1开始,通过元素1的next指针访问到元素2,再通过元素2的next指针访问到元素3。同理,搜索一个元素在最坏情况下,需要遍历整个链表,所以访问与搜索的时间复杂度为O(n)。
三、单端链表练习题
206、反转链表
解题思路:
创建2个指针cur和pre,两个指针同时后移,每后移一次反转局部next指针的指向,直到pre指针为NULL。
第一步,创建指针。pre在前,cur在后。
第二步,创建临时指针,用来保存pre断开连接的地址。
第三步,局部next指针反转。临时指针t在此时发挥作用,保存pre的next指针断开与元素2的连接后的地址。
第四步,cur与pre后移,同时在进入新循环后临时指针t后移。
第五步,重复上述动作。
代码如下
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* cur = new ListNode;
cur = NULL;
ListNode* pre = new ListNode;
pre = head;
while(pre != NULL){
ListNode* t = pre->next;
pre->next = cur;
cur = pre;
pre = t;
}
return cur;
}
};
以上仅仅为链表中的单端链表,且仅为简单应用。中间过程如果出错烦请提醒!!!