-, HashSet<string>, List<string>.
, . .
HashSet<string> result = new HashSet<string>();
foreach (string word in allWords) {
string candidate = word.Substring(0, word.Length - 1);
if (allWords.Contains(candidate)) { result.Add(candidate); }
candidate = word.Substring(1, word.Length - 1);
if (allWords.Contains(candidate)) { result.Add(candidate); }
}
LINQ:
List<string> hookWords = allWords
.Select(word => word.Substring(0, word.Length - 1))
.Concat(allWords.Select(word => word.Substring(1, word.Length - 1)))
.Distinct()
.Where(candidate => allWords.Contains(candidate))
.ToList();
, : ideone