题解 | #翻转链表的节点#
反转链表
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; }