算法:将一个单链表在不占用其他存储空间的情况下进行倒置
要求:
//将单链表中的所有元素倒序
//例如:将a→b→c→d变为d→c→b→a即可
我的做法:
思路:首先我们要想好怎么做,我们不能占用其他的存储空间,所以我们不能new Node(),所以对单链表进行就地逆序是最好的,最快的。
1.逆序的前提是链表长度必须大于1,这个是显而易见的。
2.头结点head不参与逆序,他始终做头结点。
3.定义一个P_new=this.head.next作为最后结果的新表。
4.定义P_old=P_new.next为旧表,用来顺次取元素。
5.此时,为了我们的目的,P_new作为新表应该只有第一个结点,故P_new.next=null作为新表表尾。这样我们就把初始链表三分了(head,P_new,P_old)
6.再定义一个Node q作为变量。
7.循环条件应该设为:P_old不为空,每一个结点都要逆序都要执行循环,而P_old不为空就意味着有结点。
8.循环内部:当P_old不为空时开始循环,先令q=P_old,即旧表第一个结点,以“解放第一个结点”;旧表第一个结点“解放”出来后游标后移;将q的next指向新表的首元结点;此时首元结点为q,所以需要更新结点,令P_new=q。
9.由于新表的首元结点一直在更新,跳出循环的时候P_new和q都指向首元结点,所以把之前一直闲着的head同学拿过来,令head.next=P_new。
算法的代码如下:(c#)
public void Newreversion(