链表反转

185 阅读1分钟

方法1:
采用递归方法 1.找到头结点的下一个结点nextnode
2.递归找到反转前的尾结点,将尾结点作为新链表的头结点
3.将nextnode指向head
4.head设为null
5.返回新链表

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 || head.next==null)
            return head;
        ListNode nextnode=head.next;
        ListNode newhead=ReverseList(nextnode);
        nextnode.next=head;
        head.next=null;
        return newhead;
    }
}

方法2:
遍历:将当前节点cur的下一个节点 cur.next放入到temp后,然后更改当前节点指针指向上一结点pre

public ListNode ReverseList(ListNode head) {
	if (head == null)
            return head;
	ListNode pre = head;// 上一结点
	ListNode cur = head.next;// 当前结点
	ListNode tmp;// 临时结点,用于保存当前结点的指针域(即下一结点)
	while (cur != null) {// 当前结点为null,说明位于尾结点
		tmp = cur.next;
		cur.next=pre;// 反转指针域的指向
		// 指针往下移动
		pre = cur;
		cur = tmp;
	}
	// 最后将原链表的头节点的指针域置为null,还回新链表的头结点,即原链表的尾结点
	head.next=null;
	return pre;
	}