题解 | #翻转链表的节点#
反转链表
http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca
解法参照图文教学,解法清晰.
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
//考虑空链表
if(head==null) return head;
//非空链表[只有一个节点,就不用翻转了]
if(head.next==null) return head;
//有多个节点就需要翻转
ListNode current=head;//当前节点
ListNode pre = null;//当前节点的前驱结点
ListNode pnext = null;//当前节点的后继节点
while(current!=null){
pnext = current.next; //记录当前节点的后继节点
current.next = pre; //断链,让当前节点的后继节点指向前驱节点
//pre,current指针向后移动.
pre = current; //前驱指针指向当前指针.
current = pnext;//当前指向指向后继指针.
}
return pre;
}
}
解法二:
利用链表的头插法来实现翻转.
/**
* 利用单链表的头插法实现
* @param head
* @return
*/
public static ListNode Method2(ListNode head){
//考虑空链表 和 考虑只有一个节点
if(head==null||head.next==null) return head;
ListNode newHead = null; //新链表的头
ListNode p = head;
ListNode pnext = null; //用来记录当前节点的next
while(p!=null){
pnext = p.next;
p.next = newHead;
newHead = p;
p = pnext;
}
return newHead;
}


查看12道真题和解析