• remove Nth Node from linked list从链表中删除倒数第n个元素


    Given a linked list, remove the nth node from the end of list and return its head.

    For example,

       Given linked list: 1->2->3->4->5, and n = 2.
    
       After removing the second node from the end, the linked list becomes 1->2->3->5.
    

    Note:
    Given n will always be valid.
    Try to do this in one pass.

    删除倒数第n个节点,注意:只能遍历一次链表。

    题目要求只能遍历一次链表,所以不能先求出链表长度,然后再从前往后遍历删除。

    知道两个指针,一个先走一个后走,当先走的走到最后一个时,后走的走到被删除的前一个,这样自己举例分析先走多少步(n步)
    可以使用两个指针,一个快,一个慢(其实是一个先走一个后走),快指针比慢指针先走n步,也就是中间隔着n-1个节点,也就是当快指针走到最后一个节点时,慢指针在要被删除的节点的前面一个,这样可以通过慢指针删除节点。由于可能删除的是头结点,所以得在头结点前面加一个节点,这样便于删除,而且快慢指针也是从该节点开始遍历。

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode removeNthFromEnd(ListNode head, int n) {
         
            ListNode beforeHead=new ListNode(0);
            beforeHead.next=head;
            ListNode fast=beforeHead;
            ListNode slow=beforeHead;
            //fast指针遍历到最后一个节点,而当快指针遍历n次以后,慢指针开始遍历,这样快指针就比慢指针快n步
            while(fast.next!=null){
                fast=fast.next;//快指针遍历
                if(n<=0)  //用n作为计数器
                    slow=slow.next;
                n--;//遍历一次n减小1,当n减小到0,表示快指针遍历了n步。
            }
            //这时,slow在被删除的节点前面一个位置
            if(slow.next!=null)
                slow.next=slow.next.next;
            
            return beforeHead.next;
         
        }
    }
  • 相关阅读:
    模板---templates
    django框架基础
    文件操作
    C++异常处理基本句法测试
    模板类在包含友元情况下的分离编写
    C++中构造函数作用
    hex文件和bin文件区别
    Keil MDK 和 IAR 两款ARM开发工具区别比较
    ubuntu下安装stm32开发环境
    IAR安装破解教程
  • 原文地址:https://www.cnblogs.com/xiaolovewei/p/8093795.html
Copyright © 2020-2023  润新知