题目:
一开始看到这个题目我是有点懵的,因为链表没法从尾巴开始找嘛。双重循环肯定是可以解决的,但感觉意义就不大了。
解法1:
这个解法的思想我觉得其实有点像移动窗口。
第一个for循环将temp1和temp2之间的距离保持为n,第二个while循环将两者一起往后移动,当temp2指向这个链表的最后一个节点时,temp1指向倒数第n个节点的前一个节点(可以自己画图模拟试试看),刚好可以用很常用的语句进行链表节点删除。
哑节点主要是因为头结点有可能被删除,避免了特殊判断头节点的消耗。
解法2:
这个是用栈来解决。因为栈有先进后出的特点。
第一个循环把所有的节点都放入栈,第二个循环开始从栈顶弹出。
弹出的第一个数是链表的倒数第一个数,弹出的第二个数是链表的倒数第二个数。
弹到倒数第n个数的时候就可以执行删除语句啦。
ps:放入栈中毫不影响节点间next的链接关系。