代码随想录算法训练营第三天|203(移除链表元素),707(设计链表),206(反转链表)
链表
203.移除链表元素
707.设计链表
206.反转链表
这三道题都可以用单链表来解决。
这里规定自己必须用dummyHead的方法来做链表题。题中没规定head则只声明一个dummyHead,题中有head,则声明dummyHead指向它,并在最后返回之前将head=dummyHead.next。在实际查询的过程中,需要new一个探子curr = dummyHead,让它去不断搜索。
链表难点在于:根据需要的不同操作找到对应的节点。这里假设链表index从0开始。
例如删除index下标为a的节点x0,我们需要找到下标为a-1的节点y0。然后通过y0.next = y0.next.next来删除x0节点。
而查询index下标为a的节点x0,我们就需要找到其本身。
从dummyHead开始到index为a需要的步数为a步,也就是a次循环。到index为a-1的节点自然只需要a-1步
点击查看代码
for(int i = 0;i<=index;i++)
{
// 从 dummyHead 到 index节点处
// 即可以查询
currNode = currNode.next;
}
for(int i = 0;i<index;i++)
{
// 从 dummyHead 到 index 前一个节点处
// 即可以删除
currNode = currNode.next;
}
根据需要,有时也可以为链表维护一个Length变量。
反转链表的思路:以两个节点为一组依次反转,采用双指针思想,一个pre指针表示组中前一个节点,curr表示后一个节点。每次反转后一次后移,比较重要的是停止条件,停止条件是curr为null。因为curr到最后一个节点时,还没进行最后一次反转,所以用curr.next为null作为停止条件,会导致最后差一点没反转。最终则是返回pre作为反转链表的新头部。
点击查看代码
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode pre = null;
ListNode curr = head;
ListNode temp;
while(curr!=null){
temp = curr.next;
curr.next = pre;
pre = curr;
curr = temp;
}
return pre;
}
}