Login dark

https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

/**
 * Definition for a singly-linked list.
 * class ListNode {
 *     public $val = 0;
 *     public $next = null;
 *     function __construct($val) { $this->val = $val; }
 * }
 */
class Solution {

    /**
     * @param ListNode $head
     * @param Integer $n
     * @return ListNode
     */
    function removeNthFromEnd($head, $n) {
        //当前位置为倒数第一个
        $i = 1;
        //节点总数
        $count = 0;
        //遍历节点
        $now = $head;
        //倒数目标节点
        $targetNode = $head;
        while(!empty($now)){
            $count++;
            //取倒数目标节点前一个节点
            if($i <= $n + 1){
                $targetNode = $head;
                //这里多加了一次
                $i++;
            }else{
                //跟随now节点往后递推
                $targetNode = $targetNode->next;
            }
            $now = $now->next;
        }
        if($head == $targetNode && $i != $n + 2){
            //删除的是头节点
            return $targetNode->next;
        }else{
            $targetNode->next = $targetNode->next->next;
        }
        // echo $count,',',$i,',',$n,"\n";
        return $head;
    }
}

跟php一样思路的解法

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        i = 1
        count = 0
        now = head
        targetNode = head
        while now:
            count += 1
            if i <= n + 1:
                i += 1
            else:
                targetNode = targetNode.next
            now = now.next
        if head == targetNode and i != n + 2:
            return targetNode.next
        else:
            targetNode.next = targetNode.next.next
        return head

python更简洁的解法

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        #快指针和慢指针控制在两个距离,当first到头,second就走到了指定位置
        first = head
        second = head
        while first:
            #当n用完,表示快慢指针已到达指定位置
            if n + 1 > 0:
                n -= 1
            else:
                # if not first.next:
                second = second.next
            first = first.next
        # print(second,n)
        if head == second and n == 0:
            return second.next
        else:
            second.next = second.next.next
        return head