PK=primary key
FK is foreign key, pointing to a PK from another table. In 'real' databases this means that you cannot ever insert a value that does not already exist in the other column (you can't link an url to a non-existing category)
I'd advise a small naming change, because you're bound to mistake 'link' as in hyperlink with 'link' as in 'link between hyperlink and category'.
urls
url_id(PK)|title|desc|location
catagory
cat_id(PK)|parent_cat_id(FK)|name
cat_link
id(PK)|url_id(PK&FK)|cat_id(PK&FK)
Notice that cat_link has a three-way PK, because you can only link one url to each category once. You can link one url to several categories, but no category can have the same url twice.
The 'id' field in the cat_link is there for maintenance, it's much easier to refer to records using an ID than by using the data in the record. (for example when you are printing a list of links and making them clickable for editing/deleting)
Small note on the side: put a little check in your script to make sure that a category can NEVER have itself as a parent. That would give an infinite loop that you may not find untill you have pulled all your hair out of your head.