算法面试3---链表

1 链表反转

例1:LeetCode 206。本题虽然简单但却是众多公司的面试问题。反转前后的图示如下:

 在反转的过程中主要是依据指针之间的移动,如下图所示:

class Solution {

    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        while (head != null) {
            //1 每次修改前先把head.next备份否则head修改后找不到head.next
            ListNode nextTemp = head.next; 
            //2 修改head.next temp用来保存的是上次头节点的信息
            head.next = prev;
            //3 temp进行更新保存此次头节点的信息
            prev = head;
            //4 继续进行遍历
            head = nextTemp;
        }    
        //返回新链表的头结点
        return prev;        
    }
        
}

//递归版本的实现
class Solution {
    
    public ListNode reverseList(ListNode head) {
        //递归的终止条件
        if (head == null || head.next == null) return head;
        //递归处理的操作是从最后一个元素开始的
        ListNode p = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return p;
    }
}

与此类似的有题目:LeetCode:92

注: 对于链表操作的一些基础问题:LeetCode 83、86、328、2、445

2 设立链表的虚拟的头结点

 例1:LeetCode 203。对于删除一个节点其图示如下,设待删除的节点为3。

 在上面的删除逻辑中对于最后一个元素也是成立的,因为最后一个元素的下一个为NULL。但问题在于第一个元素不成立,因为cur需要指在待删除节点的前一个节点。

0

猜你喜欢

转载自www.cnblogs.com/youngao/p/11525932.html