在这里继续刷leetcode。
为了保证效率,在这里主要刷链表题,并且做总结,
从最简单的链表题开始
什么是链表
单向链表类似于火车,有一个火车头,火车头会连接一个节点,节点上有乘客,并且这个节点会连接下一个节点,以此类推。
- 链表的火车结构
链表的数据结构
head 属性作为(指针)指向链表的第一个节点。
链表中的最后一个节点指向 null。 当链表中一个节点也没有的时候,head 直接指向 null。
需要注意的点
注意,在链表题目当中,所有的head都是一个指针通过操控指针的方式来对整条链表循环遍历。
传head不代表传整个链表,而是传一个指针,任何链表当中的复制例如(cur=head)都是复制一个指针,来对原数据进行操作,再通过head这个没有改变的指针来返回原数据。
在此之前有些人会有误解,以为传head中的cur为什么复制后还会对引用数据影响,因为在这里复制的是指针,而不是整个数据
另外head指向当前节点,next指向下一个节点,知道这些就可以开始做题了。
题目
1.反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2] 输出:[2,1]
示例 3:
输入:head = [] 输出:[]
解答
在这里通过
题目2 合并链表
请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。
题目数据保证需要删除的节点 不是末尾节点 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/delete-node-in-a-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这里主要考虑用递归的方式,递归总共分为两个过程,一个叫递,在递的过程当中,一直存放在栈当中,栈是先进后出,直到遇到终止条件开始归把结果return给next。
var mergeTwoLists = function(list1, list2) {
if (list1==null) {
return l2;
}else if(list2 === null){
return l1;
}
if(l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;}
else{
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
};
两个链表相互判定,谁小就拿谁当头
这里传进去的链表,还是要注意head是头节点,以及当最后一个返回的时候,其实是返回整个节点
题目3:删除链表的节点
注意条件,如果目标节点在头,应该直接返回链表的下个节点,接下来判定,如果找到要去掉的节点,就直接next.next,然后返回
分隔链表
这一道题,通过遍历左右两个节点.形成两个子串,再拼接再一起