算法学习记录-链表相关

1.leetcode 707.设计链表

想插入或删除第n个节点,要让current指向n-1个节点,current.next指向第n个节点,这样才能操作第n个节点。

增加节点时,要先进行步骤①,再进行步骤②,不然会丢失后面节点的指针。

2.leetcode 206.反转链表

该题目不需要使用虚拟头节点,如果使用,在返回结果时链表的最后会返回虚拟头节点,结果报错。在声明变量时,把pre和temp声明为null即可。

ListNode pre = null;
ListNode cur = head;
ListNode temp = null;

3.leetcode 24.两两交换链表中的节点

对firstNode、secondNode、tempNode的赋值过程都放在while中;

while判断条件,cur.next != null && cur.next.next != null;

初始化时cur为虚拟头节点,循环中cur为要交换的两个节点的前一个节点。

while(cur.next != null && cur.next.next != null){
    firstNode = cur.next;
    secondNode = cur.next.next;
    tempNode = cur.next.next.next;

    cur.next = secondNode;         //步骤一
    secondNode.next = firstNode;   //步骤二
    firstNode.next = tempNode;     //步骤三

    cur = firstNode;  //cur为后面两个要交换节点的前一个节点
}

4.leetcode 面试题 02.07.链表相交

链表相交

不需要使用虚拟头节点。

while(gap-- > 0){      //括号中不能直接写成(gap--)
    curA = curA.next;
}

5.leetcode 142.环形链表

环形链表Ⅱ

不需要使用虚拟头节点。

注意第一层while的循环条件,另外还要注意判断有环的条件(快慢指针相遇)和判断入环点的条件(头节点和相遇点同时出发后的交点)。

while(fast != null && fast.next != null){    
//不要把括号中的条件写成fast.next != null && fast.next.next != null
//也不能只写成fast.next != null,会报空指针异常
    
}

6.leetcode 19.删除链表的倒数第N个节点

删除链表的倒数第N个节点

双指针走到指定位置,然后进行删除操作时,记得判断一下slow.next是否为空,避免出现空指针异常,如果不加判断,在测试案例中 输入实例 [1] ,就会出现异常。

if(slow.next != null){
    slow.next = slow.next.next;
}

经测试上述问题不是未加判断导致的,而是返回结果有误,应该返回dummy.next,而不是直接返回head。

如下就是未加判断的情况,仍能正常通过。

public ListNode removeNthFromEnd(ListNode head, int n) {
    ListNode dummy = new ListNode(-1, head);
    ListNode fast = dummy;
    ListNode slow = dummy;

    for(int i = 0;i < n;i++){
        fast = fast.next;
    }

    while(fast.next != null){
        fast = fast.next;
        slow = slow.next;
    }
    slow.next = slow.next.next;
    return dummy.next;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值