LeetCode 206 : 반대 목록 목록 링크 역 회전

단일 연결리스트를 역방향.

단일 연결리스트를 역방향.

예 :

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

고급 :
당신은 반복적 인 역 또는 반복적으로 나열 할 수 있습니다. 당신은 두 가지 방법으로이 문제를 해결할 수 있습니까?

후속 :

링크 된 목록 중 하나를 반복적으로 또는 반복적으로 반전 될 수있다. 당신은 모두를 구현할 수 있을까요?

문제 해결 아이디어 :

마지막 노드에 각각의 이송은 시간 복잡도가 너무 높은 경우에도이 방법을 촬영합니다. 이러한 두 가지 방법, 반복과 재귀의 요구 사항과 같은 고급 주제 :

반복 :

마다 하위 노드 중 노드 기본 노드로서 새로운리스트에 추가된다 :

오리지널리스트 : 1-> 2-> 3-> 4 -> 5

새로운 노드의 첫번째 노드를 분리하면 헤더리스트로 추가된다 : 2-> 3-> 4 -> 5 : 1의 오리지널리스트

노드로서 분리 된 헤드 노드가 새로운리스트에 추가된다 : 2-> 1 오리지널리스트 : 3-> 4 -> 5

3-> 2-> 1 오리지널리스트 : 4-> 5 노드로 분리 된 헤드 노드는 새로운리스트에 추가

4-> 3-> 2-> 1 오리지널리스트 : 노드로 분리 된 헤드 노드는 새로운리스트에 추가 5

5-> 4-> 3-> 2-> 1 오리지널리스트 : 노드로 분리 된 헤드 노드는 새로운리스트에 추가 널

자바:

class Solution {
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode pre = null;
        ListNode tmp = null;
        while (head != null) {
            tmp = head.next;//tmp暂存当前节点的下一个节点
            head.next = pre;//当前节点下一个指向pre
            pre = head;//刷新pre
            head = tmp;//刷新当前节点为tmp
        }
        return pre;
    }
}

Python3 :

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        pre,tmp=None,None
        while(head):
            tmp=head.next
            head.next=pre
            pre=head
            head=tmp
        return pre

재귀 :

실제로 재귀 함수의 전체 스택입니다 : 밖으로 지속

기준 조건은 동일하고있다 재귀 함수에 전달리스트의 마지막 노드에 대한 객체를 반환 (목록의 마지막에) 빈 노드가 발생했습니다. 하나 개의 노드와 신규 노드로 분리 한리스트의 끝에서 헤드리스트의 말미에 부가된다. 그리고 반복적 인 방법과 비슷한 원리.

오리지널리스트 : 1-> 2-> 3-> 4 -> 5

재귀 최종 계층 발생한 노드가 null 꼬리 노드 5를 반환

재발 다시 새로운리스트의 스플릿 테일 노드의 노드로 층 5 : 5 5 노드 초기 블랭크 원래리스트 1-> 2-> 3-> 4 -> 널

새로운리스트의 스플릿 테일 노드의 노드로 다시 회귀 층 4 : 5> 4 블랭킹 원 노드 (4), 원래 목록 1-> 2-> 3-> 널

다시 새로운 별도 테일 노드리스트로서 이전 노드 3 재발 5-> 3-> 3 원 노드 3 오리지널리스트 블랭킹 1-> 2-> 널

다시 새 연결리스트로 분할 노드 2의 이전 노드 재발 5-> 4-> 3-> 2 원래 블랭킹 노드 2 원래리스트 1-> 널

다시 새 연결리스트로 분할 노드의 이전 노드 재발 5-> 3-> 3> 2> 1, 원래 노드 블랭킹 원래 널리스트

자바:

class Solution {
    public ListNode reverseList(ListNode head) {
        //基线条件
        if (head == null || head.next == null) return head;
        //递归
        ListNode tmp = head.next;//暂存头节点的下一个节点
        ListNode pre = reverseList(head.next);//递归调用该函数,pre为返回的新链表的头节点,原链表的最后一个节点,无论递归多少层该返回值一直传递不变
        tmp.next = head;//暂存的下一个节点指向传入节点
        head.next = null;//下一个节点即原本指向tmp的节点 置空
        return pre;
    }
}

Python3 :

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        tmp = head.next
        pre = self.reverseList(head.next)
        tmp.next = head
        head.next = None
        return pre

브러시 번호 제목으로 대중의 관심에 오신 것을 환영합니다 : 사랑 버그 쓰기

나는 Bug.png를 작성하는 사랑

추천

출처www.cnblogs.com/zhangzhe532/p/11224399.html