反转链表+删除链表倒数第N个节点

文章介绍了两种处理链表的方法:一是使用虚拟头节点实现链表的反转,二是利用快慢指针定位并删除链表中倒数第N个节点。这两种方法都涉及链表操作和指针技巧在编程中的应用。
摘要由CSDN通过智能技术生成

反转链表有很多方法比如虚拟头节点头插法,或者用下面这个方法:也是leetcode

class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode dumphead = new ListNode(-1);
        dumphead.next=head;
        ListNode cur = dumphead;
        ListNode temp1 = null;
        ListNode temp2 =null;
        while(cur.next!=null&&cur.next.next!=null){
            temp1 = cur.next;
            temp2 = cur.next.next.next;
            cur.next = temp1.next;
            temp1.next.next = temp1;
            temp1.next = temp2;
            cur = temp1;
        }
        return dumphead.next;

    }
}

而删除链表倒数第N个节点:

可以理解为,删除链表翻转过来的第n个。但是还有更有的解法:有n这个信息就可以知道删除的节点在第N个位置,那么使用快慢指针定窗口的方式,让快指针指向链表尾后面null,慢指针指向删除节点位置的前一个,执行删除操作即可。

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummyNode = new ListNode(0);
    dummyNode.next = head;

    ListNode fastIndex = dummyNode;
    ListNode slowIndex = dummyNode;

    // 只要快慢指针相差 n 个结点即可
    for (int i = 0; i <= n  ; i++){ 
        fastIndex = fastIndex.next;
    }

    while (fastIndex != null){
        fastIndex = fastIndex.next;
        slowIndex = slowIndex.next;
    }

    //此时 slowIndex 的位置就是待删除元素的前一个位置。
    //具体情况可自己画一个链表长度为 3 的图来模拟代码来理解
    slowIndex.next = slowIndex.next.next;
    return dummyNode.next;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值