code: public final synchronized Link getNextLink(Link link)
      {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.entry(this, tc, "getNextLink", link);
  
          Link nextLink = null;
  
          if (link == null)
          {
              nextLink = _dummyHead.getNextPhysicalLink();
          }
          else
          {
              // Defect 493652/PK59872
              // If the link provided is PhysicallyUnlinked then it is 
              // likely that another thread has removed it while our 
              // thread was inspecting it. In order to avoid stopping
              // in the middle of a find/removeFirstMatching search we
              // need to start from the beginning of the list again.
              if (link.isPhysicallyUnlinked())
              {
                  nextLink = _dummyHead.getNextPhysicalLink();
  
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Current link is PhysicallyUnlinked so returning to beginning of list.");
              }
              else
              {
                  nextLink = link.getNextPhysicalLink();
              }
          }
  
          while (nextLink != null && nextLink.isLogicallyUnlinked())
          {
              nextLink = nextLink.getNextPhysicalLink();
          }
  
          if (nextLink == _dummyTail)
          {
              nextLink = null;
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(this, tc, "getNextLink", nextLink);
          return nextLink;
      }
docs: Reply the next (valid) link after the specified link. If the specified link is null then
  start at beginning of list.
  
  @param after
  @return