class Solution {
public void deleteNode(ListNode node) {
//删除当前节点node ,可以删去其下一个节点,
//并将下一个节点的值赋值给当前节点
node.val = node.next.val;
node.next = node.next.next;
}
}
Q2.4 分割链表
class Solution {
/*
这个题目的意思其实是:将所有小于 x 的节点放在 x 节点之前
例如:
[1,4,3,2,5,2] 3 -> [1, 2, 2, 3, 4, 5]
[3, 5, 8, 5, 10, 2, 1] 5 -> [1, 2, 3, 5, 5, 8, 10]
方法: 双指针
cur 为遍历的当前节点。pre 为遍从前向后第一个未交换的节点
cur 向后遍历过程总若遇到小于 x 的元素 则与pre 进行交换
*/
public ListNode partition(ListNode head, int x) {
ListNode cur = head;
ListNode pre = head;
while (cur != null) {
if (cur.val < x) {
swap(cur, pre);
pre = pre.next;
}
cur = cur.next;
}
return head;
}
public void swap(ListNode p1, ListNode p2) {
int temp = p1.val;
p1.val = p2.val;
p2.val = temp;
}
}
Q2.5 链表求和
思路:
用递归解法,分别从两个链表的第一个节点开始,取一个值相加,相加的结果对10取模,取模得到值作为结果的一位节点。重复上述操作再从两个链表的下一位取值相加( 注 意 得 加 上 前 一 次 操 作 的 进 位 ) \color{red}{(注意得加上前一次操作的进位)}(注意得加上前一次操作的进位),结果存入结点,通过递归将这些节点连接起来。
/**
-
Definition for singly-linked list.
-
public class ListNode {
-
int val;
-
ListNode next;
-
ListNode(int x) { val = x; }
-
}
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//add为求和函数
ListNode res = add(l1, l2, 0);
return res;
}
//head1和head2分别为两个链表的第一个元素,value为上一次操作的进位
static ListNode add(ListNode head1,ListNode head2, int value) {
if (head1 == null && head2 == null) {
if (value == 1) {
//最后还有进位需要生成最后一个值为1的节点
return new ListNode(1);
} else {
//已完成最后一位的相加操作,开始逐层返回
return null;
}
}
if (head1 != null) {
//链表1要相加的那位不为空就把值加上
value += head1.val;
}
if (head2 != null) {
//链表2要相加的那位不为空就把值加上
value += head2.val;
}
//如果两个值相加后>=10就会产生进位,对10取模可得到减去进位的值
ListNode res = new ListNode(value % 10);
//如果两位相加的值小于10则没有进位,即进位为0
//如果两位相加的值>=10,则要向高位进1
//此处value值的意义变成了向高位的进位
value = value < 10 ? 0 : 1;
//此处的三目运算符功能是防止产生空指向异常,只有head1或者head2
//不为空的情况才下才有next节点
//传入的value值为向高位的进位
res.next = add(head1null?null:head1.next, head2null?null:head2.next, value);
return res;
}
}
Q2.6 回文链表
class Solution {
public boolean isPalindrome(ListNode head) {
if(head == null || head.next == null){
return true;
}
//找到链表中间点
ListNode low = head;
ListNode fast = head;
while(fast != null && fast.next != null){
low = low.next;
fast = fast.next.next;
}
if(fast != null){//说明有奇数个结点,low需要再走一步。
low = low.next;
}
//翻转后半段链表
ListNode cur = low.next;
low.next = null;
while(cur != null){
ListNode temp = cur.next;
cur.next = low;
low = cur;
cur = temp;
}
//比较前后段是否一致
while(low != null){
if(low.val != head.val){
return false;
}
low = low.next;
head = head.next;
}
return true;
}
}
Q2.7 链表相交
总结:
1.这里是单项链表,不可能出现剪刀形状的相交。
2.这里的是的相交是下面的情况
3.让两个节点分别从一个链表的首部开始,走完一个链表重新走另外一个链表,如果相遇必然相交,因为走的路径都是AD+DC+BD
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headAnull||headBnull)
{
return null;
}
ListNode p1=headA;
ListNode p2=headB;
while(p1!=p2)
{
p1=p1==null? headB:p1.next;
p2=p2==null? headA:p2.next;
}
return p1;
}
}
Q2.8 环路检测
总结:
各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。
-
点击此处,与我们一起交流学习
文件夹有以下学习笔记,自行下载!
-
BAT大厂面试题、独家面试工具包,
-
资料免费领取,包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter,
解释:链表中没有环。
总结:
各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。
-
点击此处,与我们一起交流学习
文件夹有以下学习笔记,自行下载!
-
BAT大厂面试题、独家面试工具包,
-
资料免费领取,包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter,
[外链图片转存中…(img-Eu4ijvAg-1645108039673)]