剑指offer-day11
删除链表的节点
思路很简单,维护一个双指针,一个指向现节点,一个指向前节点,找到要删除的节点,让前节点指向现节点的下一个节点,再让现节点指向空指针即可。主要是删除头节点的问题,我选择再维护一个头指针preHead,而答案是将其作为特殊情况处理,直接返回头节点指向的链表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
class Solution { public ListNode deleteNode(ListNode head, int val) { ListNode pre = new ListNode(-1); ListNode preHead = pre; ListNode cur = head; pre.next = cur; while(cur != null){ if(cur.val == val){ pre.next = cur.next; cur.next = null; } pre = cur; cur = cur.next; } return preHead.next; } }
|
链表中倒数第k个节点
跟上面一样,维护一个双指针,都先指向头节点,根据k值让p节点向前移动,当两个节点相距k-1时q节点和p节点一起前移,到p节点指向链表尾节点时结束,返回q节点所指向的链表即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
class Solution { public ListNode getKthFromEnd(ListNode head, int k) { ListNode p = head; ListNode q = head; for(int i = 0; i < k-1; i++){ p = p.next; } while(p.next != null){ q = q.next; p = p.next; } return q; } }
|