Èo bạn không hiểu rồi, bản chất l.pTail là 1 con trỏ trỏ tới Node cuối, node này chứa 1 con trỏ pNext trỏ tới null. Khi addTail 1 node vào, thì bản thân của node đó sẽ trở thành node cuối (tức là trở thành Tail). Dòng code :
l.pTail->pNext = p
l.pTail = p;
Dòng đầu là cho con trỏ Tail trỏ next tới p (Tail trở thành áp cuối)
Dòng 2 là cho tail là p
Còn bạn nói là thay bằng lệnh p.pnext->pnext = p là không hề có, vì p đang là con trỏ nên sẽ không có toán tử “.” và việc trỏ pnext bằng chính nó không hề đúng (cả về mặt nghĩa cũng như về mặt code). Bạn xem kĩ lại nha