Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionFactory.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionFactory.java	(revision 16198)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionFactory.java	(revision 16199)
@@ -448,4 +448,5 @@
         final String index;
         final Op op;
+        final boolean isFirstOrLast;
 
         /**
@@ -457,4 +458,5 @@
             this.index = index;
             this.op = op;
+            isFirstOrLast = op == Op.EQ && ("1".equals(index) || "-1".equals(index));
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java	(revision 16198)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java	(revision 16199)
@@ -35,4 +35,5 @@
 import org.openstreetmap.josm.gui.mappaint.Environment;
 import org.openstreetmap.josm.gui.mappaint.Range;
+import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.IndexCondition;
 import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.OpenEndPseudoClassCondition;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
@@ -220,6 +221,9 @@
                     return;
                 }
-                for (int i = 0; i < count; i++) {
-                    if (getter.apply(i).equals(e.osm) && link.matches(e.withParentAndIndexAndLinkContext(parent, i, count))) {
+                // see #18964
+                int step = firstAndLastOnly() ? count - 1 : 1;
+                for (int i = 0; i < count; i += step) {
+                    if (getter.apply(i).equals(e.osm)
+                            && link.matches(e.withParentAndIndexAndLinkContext(parent, i, count))) {
                         e.parent = parent;
                         e.index = i;
@@ -228,4 +232,13 @@
                     }
                 }
+            }
+
+            private boolean firstAndLastOnly() {
+                for (Condition c : link.conds) {
+                    if (!(c instanceof IndexCondition) || !((IndexCondition) c).isFirstOrLast) {
+                        return false;
+                    }
+                }
+                return true;
             }
 
