题目描述:
题解一:
一种很笨的办法:
1.先遍历一次链表,记录链表的长度listlen。
2.判断中间节点mid的位置,如果listlen为奇数,则mid=(listlen+1)/2,否则mid=listlen/2+1。
3.再次从head开始依次搜索链表,根据mid的位置确定中间节点。
class Solution(object): def middleNode(self, head): if head.next == None: return head node = head listlen = 0 while node: listlen = listlen+1 node = node.next if listlen%2==0: mid = listlen/2+1 else: mid = (listlen+1)/2 node = head now = 1 while now!=mid: node = node.next now = now+1 return node
题解二:
利用快慢指针,slow每次向后移动一个节点,fast每次移动两个节点,当fast到达链表结尾时,slow在链表中间节点位置。
注意:由于题目要求有两个中点的时候返回第二个,因此当链表有偶数个节点时,fast在倒数第二个节点结束,此时slow在第一个中点处,需要返回slow.next。
class Solution(object): def middleNode(self, head): slow = head fast = head while fast.next and fast.next.next: slow = slow.next fast = fast.next.next if fast.next: return slow.next return slow
题解三:
前面两种方法都需要先把链表中节点的信息保存在一个数组中,题解三只需要遍历一次链表。
参考:Leetcode 19:删除链表的倒数第N个节点(最详细解决方案!!!)_coordinate的博客-CSDN博客
思路:
1.设置一个fake头节点,fake.next=head。
2.设置两个节点node1 node2初始为fake,将node2移动到从head开始向后两个节点的位置。
3.node1 node2分别从当前位置开始向后遍历,当node1到达链表结尾时,node2.next就是要删除的节点,设置node2.next =node2.next.next即可。
class Solution(object): def removeNthFromEnd(self, head, n): now = 0 fake = ListNode() fake.next = head node1 = fake node2 = fake while now!=n+1: node1 = node1.next now = now+1 while node1!=None: node1 = node1.next node2 = node2.next node2.next = node2.next.next return fake.next