链表反转模板(不借助虚拟节点)
直接在本链表操作
public ListNode reverseList(ListNode head ) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
链表插入操作
头插法
在链表头部插入新节点,比如链表为4->5->6->null
使用头插法插入一个7那么就是:4->7->5->6->null
尾插法
就是直接在链表的最后面插入新节点
题目
LeetCode445题–链表加法
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
l1 = reverse(l1);
l2 = reverse(l2);
int carry = 0;
ListNode res = new ListNode(-1);
while (l1 != null || l2 != null || carry != 0) {
int med = carry;
if (l1 != null) {
med += l1.val;
l1 = l1.next;
}
if (l2 != null) {
med += l2.val;
l2 = l2.next;
}
int ans = med % 10;
carry = med / 10;
ListNode medNode = new ListNode(ans);
medNode.next = res.next;
res.next = medNode;
}
return res.next;
}
private ListNode reverse(ListNode head) {
ListNode prev = null;
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
return prev;
}
}
这里进行了两次链表反转之后,从头开始加,加完之后使用res作为头结点的链表进行头插法插入计算之后的结果,即可计算出答案。
记住链表的反转模板,很重要