题目描述
对给定的单链表进行反转。
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
public void reverse(){
1.定义多个指针
Node prev = null;
Node cur = this.head;
Node newHead = null; //创建空结点为了方便表示反转后的表头
//遍历单链表
while(cur != null){
//curNext指向当前结点的引用所指向的对象,代表下一次反转的结点对象
Node curNext = cur.next;
if(curNext == null){
newHead = cur; //此时新的表头指向cur,此时cur为尾结点
}
cur.next = prev; //cur的引用指向空结点
prev = cur; //prev指向cur所指向的对象
cur = curNext; //cur指向curNext所指向的对象
}
//原来的表头成了反转后的尾结点,因而需要重新指定表头,否则只打印了一个元素
this.head = newHead;
}
2.类似头插法
public void reverse1(){
Node prev = null;
while(this.head != null){
Node cur = this.head;
this.head = this.head.next;
cur.next = prev;
prev = cur;
}
this.head = prev;
}
3.类似头插法
public Node reverse2(){
Node prev = null;
Node cur = this.head;
while(cur != null){
Node curNext = cur.next;
cur.next = prev;
prev = cur;
cur =curNext;
}
return prev; //链表新的头结点
}
真心觉得链表题思路不好用文字表达,代码注释清楚比啥都强。。