文章目录
前言
百度百科:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
一、链表中倒数第k个节点
题目描述
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
这个题想明白比较简单,很容易做到100%,但是想不到的话做起来就不容易了。
我的想法是构建两个指针,等第一个指针走到第K个值的时候第二个指针开始出发,两个指针的距离始终相距K。然后等第一个到达尾部的时候第二个指针刚好到达倒数第k个节点。
过程大概就是这样的
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode fast = head;//前面的指针
ListNode slow = head;//后面的指针
for(int i=0;i<k-1;i++){
fast = fast.next;
}
while(head.next!=null){
fast = fast.next;
slow = slow.next;
}
return slow;
}
}
二、删除链表的节点
题目描述
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
注意:此题对比原题有改动
示例 1:
输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
题目解析:这个题的思路和上个题的思路类似,上一个是跟在后面K位,这个是跟在前指针的屁股后面,等他查到需要删除的值时,把前指针的下一位赋值给后指针的下一位。
代码:
class Solution {
public ListNode deleteNode(ListNode head, int val) {
ListNode thrum = new ListNode(-1);
thrum.next= head;
//定义两个指针
ListNode headhead =thrum
ListNode fronthead =thrum.next;
while(fronthead!=null){
if(fronthead.val==val){
//查找到需要删除的值
headhead.next= fronthead.next;
return thrum.next;
}
else{
headhead=headhead.next;
fronthead=fronthead.next;
}
}
return thrum.next;
三 、从尾到头打印链表
题目描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
题目解析:我的思想是先遍历链表得到链表的长度,然后再创建一个数组,将链表从数组尾部赋值,就实现了从尾到头打印链表
代码:
```java
class Solution {
public int[] reversePrint(ListNode head) {
int i = 0;
ListNode headtwo = head;
//遍历链表
while(head!=null){
head=head.next;
i++;
}
int[] sites = new int[i];
//从后往前为数组赋值
for(int t =i-1;t>=0;t--){
sites[t]=headtwo.val;
headtwo=headtwo.next;
}
return sites;
}
}
题目来源:https://leetcode-cn.com/problemset/all/
总结
总的来说这些题目较简单,适合新手做,链表的简单题比数组的简单题要简单一些。