反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
解题思路:
第一种方法是用栈,从头开始遍历整个链表,把链表节点的值放进栈内,然后后进先出,依次把栈顶元素取出,重新存入原链表,实现倒序输出
class ListNode {//链表类
int val;
ListNode next;//下一个节点
ListNode(int x) {//构造函数的初始化
val = x;
}
}
public static ListNode reverseList(ListNode head) {
// System.out.println(head.val);
Stack<Integer> a = new Stack<Integer>();
ListNode current=head;//current指向链表的头节点
while(current != null){
a.push(current.val);
current=current.next;
}
//栈a里面是反转后的链表,需要把这个栈内的元素放入到原链表中,形成一个新的链表中
// System.out.println(head.val);//此时链表仍然是原链表
current=head;//指针从head开始往后移动
while(!a.isEmpty()){
current.val=a.peek();//把当前栈顶元素的值,赋给当前节点
current = current.next;//指针后移
a.pop();
}
return head;
}
另一种解法:通过三个指针,直接对链表进行操作,这种方法比较简便,而且节省时间
public static ListNode reverseList(ListNode head) {
//如果链表为空或者只有一个元素,直接返回头元素即可
if(head == null || head.next == null) {
return head;
}
//使用三个节指针
ListNode current = head;//一个指针为当前节点
ListNode newhead = null;//另外一个节点则指向新链表表头从而保存结果
ListNode next = null;//一个指针指向当前节点的下一个节点
//指向当前节点的指针依次右移,每次分割出来的新节点指向前面分割出的节点,头节点每次右移
while(current!=null){
//先把next节点保存起来
next = current.next;
//然后切断链表,保存原头节点
current.next = newhead;
//把原头节点置为新的表头
newhead = current;
//指针右移
current = next;
}
return newhead;
}