链表操作练习

Posted mgblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表操作练习相关的知识,希望对你有一定的参考价值。

 

这里来总结一下觉得比较有思想的题啪

160. 相交链表

这里的想法是a+b与b+a遍历的时间是一样的,就是说从a链表开始遍历接着从b链表开始遍历与先遍历b在遍历a同时结束。

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA == null || headB == null) return null;
        ListNode ans = null;
        ListNode pa = headA;
        ListNode pb = headB;
        while(pa != null || pb != null) {
            if(pa == null) pa = headB;
            if(pb == null) pb = headA;
            if(pa.val == pb.val && pa == pb) {
                ans = new ListNode(pa.val);
                break;
            }
            pa = pa.next;
            pb = pb.next;
        }
        return ans;
    }
}

206. 反转链表

这应该是最重要最基础的操作了

递归法:

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode temp = head;
        ListNode next = head.next;
        head = reverseList(next);
        next.next = temp;
        temp.next = null;
        return head;
    }
}

头插法:

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode newhead = new ListNode(-1);
        while(head!=null) {
            ListNode next = head.next;
            head.next = newhead.next;
            newhead.next = head;
            head = next;
        }
        return newhead.next;
    }
}

2. 两数相加

这里有个补0的技巧,这个技巧还是蛮重要的,注意最后的进位

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = new ListNode(-1);
        ListNode p = head;
        ListNode p1 = l1;
        ListNode p2 = l2;
        int c = 0;
        int sum = 0;
        ListNode temp = null;
        while(p1!=null || p2!=null) {
            int o1 = p1 != null ? p1.val : 0;
            int o2 = p2 != null ? p2.val : 0;
            sum = o1 + o2 + c;
            c = sum/10;
            temp = new ListNode(sum%10);
            p.next = temp;
            p = temp;
            p1 = p1 == null ? null : p1.next;
            p2 = p2 == null ? null : p2.next;
        }
        if(c!=0) {
            temp = new ListNode(c);
            p.next = temp;
        }
        return head.next;
    }
}

 

 

以上是关于链表操作练习的主要内容,如果未能解决你的问题,请参考以下文章

Java实现链表操作 万字肝爆 !链表的图文解析(包含链表OJ练习解析)

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

链表练习题

重学数据结构篇2 下链表代码练习

Python算法练习--把搜索树转成双向链表

练习——旋转链表问题