链表

132 阅读3分钟

概念:
1.链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。
2.链表的入口节点称为链表的头结点也就是head。
3.链表分为单链表,双链表,循环链表
4.链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理

题目:203.移除链表元素
思路:
1.new一个虚拟头结点,可以不用区分移除的是头结点还是其他结点
2.定义一个指针cur,指向虚拟头结点,当cur.next不为null时进入循环,当cur.next.val等于target时,把cur.next.next赋值给cur.next;如果cur.next.val不等于target,把cur.next赋值给cur,就是正常循环
3.不能直接return head,因为有可能head被移除了

题目:206.反转链表
思路:
1.双指针法,循环结束的条件应该是cur指向null的时候。
2.先将cur.next保存在temp里面,然后让cur.next指向pre,此时方向就反过来了,然后当前的cur给pre,再把temp里面的值赋值给cur,就实现了两个指针向前移动的效果,如此循环。

题目:707.设计链表
思路:
获取第n个节点:
1.对第n个节点进行合法判断;
2.创建一个指针,从虚拟头节点开始遍历,n--,当n等于0时,遍历结束,获取到当前节点
在链表头部插入节点:
1.先要定义一个节点,让头节点指向这个新建的节点,长度++
在尾部插入一个节点:
1.循环遍历找到尾部节点,创建一个新节点,尾部节点的next指向这个新节点,长度++
第n个节点前插入节点:
1.在第n个节点前插入,要保证cur指向的是n的前一个元素,设置cur节点为n节点前面的节点,cur.next就是第n个节点。
删除第n个节点:
1.先对n进行合法判断;
2.遍历找到第n个节点,让这个节点的next指向这个节点的next.next

题目: 5.两两交换链表中的节点
思路:
1.判断循环终止的条件,cur.next!==null&&cur.next.next !== null;
2.使用虚拟头节点进行模拟

题目: 19.删除链表的倒数第n个节点
思路:
1.删除的是第n个节点,操作的就是n节点前面的那个节点,然后让操作节点的next指向该节点的next.next。
2.循环找到第n个节点,定义快慢双指针,先让快指针移动n步,再同时移动两个指针,直到快指针指向null,此时慢指针就指向了需要删除的节点,即倒数第n个节点。但是只有指针指向n的前一个节点,才能操作n,故快指针需要走n+1步
3.然后让当前节点的next等于当前节点的next.next

题目:02.07.链表相交
思路:
1.求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到和curB 末尾对齐的位置
2.注意两个交换变量需要加分号

题目:142.环形链表II
思路:
1.定义快慢双指针,如果两个指针相遇,说明有环 2.快指针相对于慢指针每次只能是多一步,这样两个指针才能相遇
3.从头结点出发一个指针,从相遇节点也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是环形入口的节点