761 |
|
* before using. |
762 |
|
*/ |
763 |
|
final Node firstDataNode() { |
764 |
+ |
Node first = null; |
765 |
|
restartFromHead: for (;;) { |
766 |
< |
for (Node p = head; p != null;) { |
767 |
< |
Object item = p.item; |
768 |
< |
if (p.isData) { |
769 |
< |
if (item != null) |
770 |
< |
return p; |
766 |
> |
Node h = head, p = h; |
767 |
> |
for (; p != null;) { |
768 |
> |
final Object item; |
769 |
> |
if ((item = p.item) != null) { |
770 |
> |
if (p.isData) { |
771 |
> |
first = p; |
772 |
> |
break; |
773 |
> |
} |
774 |
|
} |
775 |
< |
else if (item == null) |
775 |
> |
else if (!p.isData) |
776 |
|
break; |
777 |
< |
if (p == (p = p.next)) |
777 |
> |
final Node q; |
778 |
> |
if ((q = p.next) == null) |
779 |
> |
break; |
780 |
> |
if (p == (p = q)) |
781 |
|
continue restartFromHead; |
782 |
|
} |
783 |
< |
return null; |
783 |
> |
if (p != h && casHead(h, p)) |
784 |
> |
h.forgetNext(); |
785 |
> |
return first; |
786 |
|
} |
787 |
|
} |
788 |
|
|